sort/example/randomgen.cpp
2017-11-21 18:37:15 +01:00

70 lines
2.0 KiB
C++

// flexible random number generator providing multiple distributions.
//
// Copyright Steven Ross 2009-2014.
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org/libs/sort for library home page.
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
#include <stdio.h>
#include "stdlib.h"
#include <fstream>
#include <iostream>
using namespace boost;
int main(int argc, const char ** argv) {
random::mt19937 generator;
random::uniform_int_distribution<unsigned> distribution;
//defaults
unsigned high_shift = 16;
unsigned low_shift = 16;
unsigned count = 1000000;
//Reading in user arguments
if (argc > 1)
high_shift = atoi(argv[1]);
if (argc > 2)
low_shift = atoi(argv[2]);
if (argc > 3)
count = atoi(argv[3]);
if (high_shift > 16)
high_shift = 16;
if (low_shift > 16)
low_shift = 16;
std::ofstream ofile;
ofile.open("input.txt", std::ios_base::out | std::ios_base::binary |
std::ios_base::trunc);
if (ofile.bad()) {
printf("could not open input.txt for writing!\n");
return 1;
}
//buffering file output for speed
unsigned uDivideFactor = 1000;
//Skipping buffering for small files
if (count < uDivideFactor * 100)
uDivideFactor = count;
unsigned * pNumbers = static_cast<unsigned *>(malloc(uDivideFactor *
sizeof(unsigned)));
//Generating semirandom numbers
unsigned mask = 0;
unsigned one = 1;
for (unsigned u = 0; u < low_shift; ++u) {
mask += one << u;
}
for (unsigned u = 0; u < high_shift; ++u) {
mask += one << (16 + u);
}
for (unsigned u = 0; u < count/uDivideFactor; ++u) {
unsigned i = 0;
for (; i< uDivideFactor; ++i) {
pNumbers[i] = distribution(generator) & mask;
}
ofile.write(reinterpret_cast<char *>(pNumbers), uDivideFactor * 4 );
}
ofile.close();
return 0;
}