課題種擬似乱数ジェネレータ以上は一回しか出来ないのですか?
質問
見てかなりの数の勧告のない種擬似乱数ジェネレータは、複数回当たりの執行っ伴うものを徹底します。もちろん、見やすいのはなぜで以下の(C/C++)の例にあてはまるわけではないという
int get_rand() {
srand(time(NULL));
return rand();
}
以降の呼び出し get_rand
数回/秒の生産を繰り返します。
がん次の例では、受け入れ可能な解決策?
MyRand.h
#ifndef MY_RAND_H
#define MY_RAND_H
class MyRand
{
public:
MyRand();
int get_rand() const;
private:
static unsigned int seed_base;
};
#endif
MyRand.cpp
#include <ctime>
#include <cstdlib>
#include "MyRand.h"
unsigned int MyRand::seed_base = static_cast<unsigned int>(time(NULL));
MyRand::MyRand()
{
srand(seed_base++);
}
int MyRand::get_rand() const
{
return rand();
}
main.cpp
#include <iostream>
#include "MyRand.h"
int main(int argc, char *argv[])
{
for (int i = 0; i < 100; i++)
{
MyRand r;
std::cout << r.get_rand() << " ";
}
}
すなわちも MyRand
sのコンストラクタは複数回続、電話 srand
異なるパラメータとします。明らかに、これはスレッドセーフではありませんが、その後再度関する情報は見つかりませんでし rand
.
解決
毎回呼び出する擬似乱数ジェネレータ機能により、発電機の一部の内部状態が生成の疑似乱数との新しい内部の状態です。アルゴリズムを変換するための内部状態が厳選されたので、出力が表示されます。
き種の乱数ジェネレータには、基本的には設定はこの内部の状態です。場合にリセットの内部状態を一部予測値、とんでしまいますの外観の乱数の発生.
例えば、簡単なRNGは、線形合同発電機を設置。番号を発生するようになります:
X[n+1] = (a X[n] + c) mod m
この場合、X[n+1]であるため、結果を新しい内部の状態です。場合種子の発生時におこりましく配列するようになります:
{(ab + c) mod m, (a(b+1) + c) mod m, (a(b+2) + c) mod m, ...}
ランドマークタワーのお seed_base
.こんランダムです。
他のヒント
ご種が予想されるので、ここでいるだけでincrementingで、出力からrand()する。
この変化により契約内容の変更を理由を生成するランダム番号"、"どのように"ランダム"が受入れ可能なランダムです。おとえば、これを回避できるの重複を次々にあるいは広く、十分な気もしました。後については、どのようにお考える事項として走行します。
ほとんどすべてのプラットフォームが生成するような乱数によrand().
ものではマシニングセンタ加工をするものである必要はありません。
このシナリオはなく、コンストラクタ一時間に基づく種子が始まる前にループを実行します。を保障するランダム結果のみの架空の変種毎になります。
いないという方法は 以上 ランダムなります。
のようなものと考えることができ乱数生成(このはなく真の実施と、もしイラスト)としてテーブルの値です。だだけ電源をオンにする"ということもに統計るという簡単なランダムサンプルシード基本的には分かるので何の行と列の開始に大きなテーブルのランダムます。Reseedingまで不要にすることも出来ますので、既にその番号をお配りしています。
けが利益を播種以上に一度以降、これは良いようにします。場合はうまく管理できなければならない"より"ランダムに数多くの方法は乱数生成一例として私が考えられることはいを生み出していくことであ乱数のスレッド安全です。
なソリューションでは、番号をすべてランダムにより播種っています。srand一般的になる、コンストラクタです。い支援をランダム番号、種まきのプログラムが始まり、忘れられます。