|
三丁目の秀さん今日は、Iranoan です。
> >Randomizeを一度すれば、
> >SLEEPを入れる必要なないと思われます。
>
> 確かにその通りにしましたら、SLEEPを入れなくても乱数が生成できました?
> なぜそうなるのか解説していただけたら幸いです。
詳細は、C 言語の本で、rand(), srand() 関数の仕様を御覧頂くのが確実だ
と思います。理由は、公開されているので HideMath.dll のソースを御覧いた
だければ解りますが、Random(), Randomize() 関数が上記の関数を単純に呼び
出すラッパだからです。
これでは不親切なので、簡単に説明しておくと、まずコンピュータで生成さ
れる乱数は、実際には厳密な意味での乱数ではありません。導出方法によって
変わりますが、sin 等と同じある周期を持った周期関数です。またコンピュー
タなので、実際には算術計算をしているだけなので、プログラムを実行するた
びに、異なる乱数列を得るには、乱数を計算するときの元のなる数値 (一般に
乱数の種と呼ばれる) を変えてやる必要があります。(こうしないと、毎回同
じ乱数列が生成される。)この乱数の種を指定する関数が、srand() です。
そのような性質から、プログラムの開始から終了までに、何度も srand()
を呼び出してはいけません。それでは乱数になりません。また周期と同程度の
オーダだけ乱数が必要なら、より長い周期の乱数アルゴリズムを使用する必要
があります。このようなことから、理数系の厳密な結果が必要な場合、rand()
関数が使われていたら、結果を疑ったほうが良いです。rand() は整数値だし。
|
|