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  ----- */

stdafx.h

 #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(または) を単に読み取るよりも高速になると思います。/dev/random

于 2009-12-14T10:40:29.680 に答える
2

boost::random::random_deviceクラスをそのまま使用するか、他のジェネレーターをシードするために使用できます。

簡単な方法で、1回限りの乱数を取得できます。

ブースト::ランダム::ランダムデバイス()()

于 2012-07-13T16:53:59.543 に答える