C/C++はどのように“本当の”乱数を生成します

1611 ワード

C/C++はどのように“本当の”乱数を生成します
C言語ではrand()関数を直接用いて乱数を生成すると,実行するたびに同じ数が生成されるという気まずい局面が起こり,これは明らかに我々の期待を満たすことができない.どうしたんですか.
哲学的にも技術的にも絶対ランダムな乱数を生成することは難しいが、できるだけ「偽乱数」を「本当の」乱数のようにすることができる.
まずsrand()を知る
srand()は乱数発生器の初期化関数である.プロトタイプ関数はsrand(unsigned int seed)であり、パラメータseedによってシステムが提供するシード値を変更する.よく使われるsrand(unsigned)time(NULL))はシステムのタイマに基づいてシード値を変更し、time(NULL)は予め設定されたアルゴリズムで計算された乱数であり、時間とともに変化する.seedの値が時間とともに変化する様子を明確に見るために,以下のコードをいくつか設計した.コンパイル後に複数回実行し、毎回異なる値を出力できます.
#include
#include
using namespace std;
int main()
{
 int s=(unsigned)time(NULL);
 cout<

それにseed
システムはrand()を呼び出す前にsrand()を呼び出し、ユーザーがseedに指定した値を与えたかどうかを確認します.ある場合は、この値を擬似乱数を生成する初期値として使用し、ない場合は、一定の不変数を初期値として使用します(この値はシステムに関連しています).
これは、srand()を初期値に使用しないか、srand()を使用しているが、定値を与えると乱数が変わらないという問題を説明している.簡単に言えば、シードの値が変わってこそ、乱数が変化する可能性があります.
本題にもどる
今では、いくつかのサンプルの乱数を生成できるようになりました.
#include
#include
#include
#include
using namespace std;
int main()
{
 int a=1,b=50;
 srand((unsigned)time(NULL));
 for(int i=1;i<=10;++i)
 {
  int n=a+rand()%(b-a+1);
  cout<

上記のコードは、1~50の整数乱数を10個生成します.
注意:rand()に一定範囲のランダム整数を生成するにはどうすればいいですか?
簡単に言えば、aからbまでの整数(aとbを含む)を生成するには、a+rand%(b-a+1)を用いればよい.一般的には、aはシステムにランダム数をどこから探すべきかを教え、b−a+1は代替範囲に合計何個の整数があるかを表す.
締めくくり
私は初心者です.昔は、今は、これからは.
ブログには2つの目的があります.1つは、基礎的な知識(あるいは常識)ですが、味わう価値があります.第二に、私のレベルが低いので、もっとみんなと交流して、検討して、自分のレベルを高めたいです.
オリジナルの文章は、著作権を尊重してください.