主要的.cpp
#include "stdafx.h" #include "random_generator.h" int main ( int argc,char *argv[] ) { cout.setf(ios::fixed); base_generator_type base_generator; int max = pow(10,2); distribution_type dist(1,max); boost::variate_generator<base_generator_type&,distribution_type > uni(base_generator,dist); for ( int i=0; i<10; i++ ) { //cout << random_number(2) << endl; cout << uni() << endl; } return EXIT_SUCCESS; } /* ---------- end of function main ---------- */
random_gemerator.h
#include "stdafx.h" #include <boost/random.hpp> #include <boost/generator_iterator.hpp> typedef boost::mt19937 base_generator_type; typedef boost::lagged_fibonacci19937 fibo_generator_type; typedef boost::uniform_int<> distribution_type; typedef boost::variate_generator<fibo_generator_type&,distribution_type> gen_type; int random_number ( int bits ) { fibo_generator_type fibo_generator; int max = pow(10,bits); distribution_type dist(1,max); gen_type uni(fibo_generator,dist); return uni(); } /* ----- end of function random_number ----- */
stdafx.h中
#include <iostream> #include <cstdlib> #include <cmath> using namespace std;
每次运行它,都会产生相同的数字序列
像77,33,5,22,…
如何使用boost:随机正确?
这就对了.但也许有一点问题,如下所示:
看起来好听
get_seed(); for (;;) {cout << generate_random() << endl; } // is ok
它产生相同的随机数
int get_random() {get_seed();return generate_random();} for (;;) {cout << get_random() <<endl;} // output the same random number yet
解决方法
如果您希望每次运行程序时都会更改随机数序列,则需要通过使用当前时间进行初始化来更改随机种子
你会发现一个例子there,摘录:
/* * Change seed to something else. * * Caveat: std::time(0) is not a very good truly-random seed. When * called in rapid succession,it could return the same values,and * thus the same random number sequences could ensue. If not the same * values are returned,the values differ only slightly in the * lowest bits. A linear congruential generator with a small factor * wrapped in a uniform_smallint (see experiment) will produce the same * values for the first few iterations. This is because uniform_smallint * takes only the highest bits of the generator,and the generator itself * needs a few iterations to spread the initial entropy from the lowest bits * to the whole state. */ generator.seed(static_cast<unsigned int>(std::time(0)));