123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // a random number generator supporting different distributions.
- //
- // Copyright Steven Ross 2009.
- //
- // 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 <stdio.h>
- #include "stdlib.h"
- #include <fstream>
- #include <iostream>
- #include <vector>
- #include <string>
- #include <boost/random.hpp>
- using std::string;
- using namespace boost;
- int main(int argc, const char ** argv) {
- //Always seed with the same value, to get the same results
- srand(1);
- //defaults
- int mod_shift = 32;
- unsigned count = 1000000;
- //Reading in user arguments
- if (argc > 2)
- count = atoi(argv[2]);
- if (argc > 1)
- mod_shift = atoi(argv[1]) - 1;
- 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;
- }
- int min_int = (std::numeric_limits<int>::min)();
- int max_int = (std::numeric_limits<int>::max)();
- if (mod_shift < 31 && mod_shift >= 0) {
- max_int %= 1 << mod_shift;
- if (-max_int > min_int)
- min_int = -max_int;
- }
- std::vector<int> result;
- result.resize(count);
- mt19937 rng;
- if (argc > 3 && (string(argv[3]) == "-normal")) {
- boost::normal_distribution<> everything(0, max_int/4);
- variate_generator<mt19937&,normal_distribution<> > gen(rng, everything);
- generate(result.begin(), result.end(), gen);
- }
- else if (argc > 3 && (string(argv[3]) == "-lognormal")) {
- lognormal_distribution<> everything(max_int/2, max_int/4);
- variate_generator<mt19937&,lognormal_distribution<> > gen(rng, everything);
- generate(result.begin(), result.end(), gen);
- }
- else {
- uniform_int<> everything(min_int, max_int);
- variate_generator<mt19937&,uniform_int<> > gen(rng, everything);
- generate(result.begin(), result.end(), gen);
- }
- ofile.write(reinterpret_cast<char *>(&(result[0])), result.size() *
- sizeof(int));
- ofile.close();
- return 0;
- }
|