2017-07-17 7 views
1

ベクトルから乱数を選ぶときはいつでも、rand()というメソッドを使います。私はそれがバックエンドからどのように動作するか知りたい。cppのrand()メソッドのbankendプログラムとは何ですか?

+2

擬似乱数生成についての理論を学びたい場合は、数学と統計を大量に読み込む必要があります。擬似乱数を生成するいくつかの関数を見たいだけであれば、オープンソースのいくつかの標準ライブラリを含め、ちょっと検索するだけでかなりの数が利用できます。 –

答えて

1

randには、"back-end"が含まれていません。

ところで、C++では、<random>の標準ヘッダと関連ユーティリティを使用するのが良いでしょう。これはC++ standard libraryです。

rand関数は、C standard libraryの一部です。これはC++ベクタとは無関係です。

これらは(いずれも<random>の機能とユーティリティ)pseudo-random number generatorsに基づいています。かなり複雑なフィールドです。優れたPRNGを発明することで、PhDを手に入れることができます。

あなたはrandがある(または可能)実装方法を理解したい場合は、よりよい(例えば、GNU glibcまたはmusl-libcなど)いくつかの既存のfree software C標準ライブラリのソースコードを勉強しましょう。

<random>の実装方法を理解したい場合は、C++標準ライブラリのソースコードを調べてください。 GCCコンパイラ(たとえば、g++プログラムでコンパイルする)を使用する場合は、コンパイラによって提供されます。

1

randにはシード値があります。 ....

srand(time(NULL)); // second good enough 

は次にこのようないくつかの数学がある...現在時刻に

unsigned int seed; // set by srand 
unsigned int rand() { 
    seed = seed * number + offset; 
    return seed; 
} 

数と選択されたオフセットので `の範囲の全体を、それを設定します署名されていないintが対象です。これは一般に素数の形を意味します。

コメントに記載されているとおり、これは非常に複雑な領域です。

srandが呼び出されない場合、シードに初期値が設定されます。つまり、スレッドのタイミングの問題は無視されます。実行するたびに同じ結果が得られます。

テストを再実行するのに便利ですが、ゲームロジックと言えば問題あります。

+0

"数値とオフセットが選択されているので、' unsigned int'の範囲全体がカバーされます - False。範囲全体は '0-UINT_MAX'ですが、' rand() 'は' 0-RAND_MAX'だけをカバーする必要があります。これは、32767ほど低いかもしれません。 – MSalters

+0

この(線形合同ジェネレータ)は、 'rand()'の1つの実装です。それはかなり一般的ですが、CやC++のどちらもこのアプローチを必要とせず、実装によってはそれとは異なります。 –