10

主要的.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  ----- */

标准数据文件

 #include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

每次我运行它,它都会生成相同的数字序列

像 77, 33,5, 22 , ...

如何正确使用 boost:random?


这就对了。但可能有一点问题,如下所示:

听起来不错

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
4

4 回答 4

13

如果您希望每次运行程序时都更改随机数序列,则需要通过使用当前时间对其进行初始化来更改随机种子

你会在那里找到一个例子,摘录:

/*
 * 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)));
于 2009-12-04T07:49:37.367 回答
6

您需要播种随机数生成器,这样它就不会每次都从同一个地方开始。

根据您对数字的处理方式,您可能需要考虑如何选择种子值。如果您需要高质量的随机性(如果您正在生成加密密钥并希望它们相当安全),您将需要一个好的种子值。如果这是 Posix,我会建议 /dev/random - 但你看起来正在使用 Windows,所以我不确定什么是好的种子源。

但是,如果您不介意可预测的种子(用于游戏、模拟等),那么快速而肮脏的种子就是 time() 返回的当前时间戳。

于 2009-12-04T07:48:43.510 回答
5

如果你在'nix 系统上运行,你总是可以尝试这样的;

int getSeed()
{
    ifstream rand("/dev/urandom");
    char tmp[sizeof(int)];
    rand.read(tmp,sizeof(int));
    rand.close();
    int* number = reinterpret_cast<int*>(tmp);
    return (*number);
}

我猜以这种方式播种随机数生成器比简单地读取/dev/urandom(or /dev/random) 来满足您的所有随机数需求要快。

于 2009-12-14T10:40:29.680 回答
2

您可以按原样使用boost::random::random_device类,也可以为其他生成器播种。

您可以通过一个简单的方法从中获得一次性随机数:

boost::random::random_device()()

于 2012-07-13T16:53:59.543 回答