■掲示板に戻る■ 全部 1- 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 最新50



レス数が1000を超えています。残念ながら全部は表示しません。

FreeBSDを語ろう Part.2

142 :名無しさん@お腹いっぱい。 :02/10/17 11:01
/usr/src/lib/libc/stdlib/rand.c を見ると、
http://www.soi.wide.ad.jp/class/20010000/slides/03/sfc2002.pdf
で書かれている70年代−90年代までの古典的標準擬似乱数の式そのままです。
FreeBSD の rand(3) はこの古典的乱数生成式を今でも使っている。
これを % 演算すると、シミュレーションに使えないどころか、簡単なゲームにも使えない。
man 3 rand には bad random generator と良くないとはっきり書いてある。
4.4BSD lite のソースを見つけられなかったので、これが FreeBSD
だけの問題か 4.4BSD lite に由来する問題かはわかんないです。

ところで rand() は ANSI 関数だが ANSI では生成式まで規定していない。
GNU CLIB の glibc では rand() はそのまま random() を呼んでいる。
random() は ANSI 関数じゃないので、標準化されていない。
例えば BSD は random( void ) で RAND_MAX 未満の整数値を返すが、
Windows 版 Borland C/C++ では random( int )で引数値未満を返す。

お手軽に使う擬似乱数に ANSI 関数でかつ古典的 rand(3) を使うの
であれば、どこかの偉い人が次のように書いている。

1 と 10 の間の乱数を生成したいのであれば、常に
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
を用いて行いなさい。


掲示板に戻る 全部 前100 次100 最新50

read.cgi ver5.26+ (01/10/21-)