ベクトルから乱数を選ぶときはいつでも、rand()というメソッドを使います。私はそれがバックエンドからどのように動作するか知りたい。cppのrand()メソッドのbankendプログラムとは何ですか?
答えて
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++
プログラムでコンパイルする)を使用する場合は、コンパイラによって提供されます。
randにはシード値があります。 ....
srand(time(NULL)); // second good enough
は次にこのようないくつかの数学がある...現在時刻に
unsigned int seed; // set by srand
unsigned int rand() {
seed = seed * number + offset;
return seed;
}
数と選択されたオフセットので `の範囲の全体を、それを設定します署名されていないintが対象です。これは一般に素数の形を意味します。
コメントに記載されているとおり、これは非常に複雑な領域です。
srand
が呼び出されない場合、シードに初期値が設定されます。つまり、スレッドのタイミングの問題は無視されます。実行するたびに同じ結果が得られます。
テストを再実行するのに便利ですが、ゲームロジックと言えば問題あります。
"数値とオフセットが選択されているので、' unsigned int'の範囲全体がカバーされます - False。範囲全体は '0-UINT_MAX'ですが、' rand() 'は' 0-RAND_MAX'だけをカバーする必要があります。これは、32767ほど低いかもしれません。 – MSalters
この(線形合同ジェネレータ)は、 'rand()'の1つの実装です。それはかなり一般的ですが、CやC++のどちらもこのアプローチを必要とせず、実装によってはそれとは異なります。 –
擬似乱数生成についての理論を学びたい場合は、数学と統計を大量に読み込む必要があります。擬似乱数を生成するいくつかの関数を見たいだけであれば、オープンソースのいくつかの標準ライブラリを含め、ちょっと検索するだけでかなりの数が利用できます。 –