The versions of rand() and srand() in the Linux C Library use the same random number generator as random() and srandom(), so the lower-order bits should be as random as the higher-order bits. However, on older rand() implementations, and on current implementations on different systems, the lower-order bits are much less random than the higher-order bits. Do not use this function in applications intended to be portable when good randomness is needed.
タイトルが秀逸だったので張ります (スコア:2, 興味深い)
真の低脳は意外なところに潜む [rabi-en-rose.net]
Re:タイトルが秀逸だったので張ります (スコア:1)
> やがてそのような書き込みの中に、Cコードを示して「サイコロなんかたったこれだけで作れるのに」と発言する物が複数現れた。そしてこれが最も重要な点だが、そのようにして示されたコードは、私が見た限りでは一つ残らず全てカルドセプトサーガのプログラマが犯したのと同じミスをしていた。
自力で疑似乱数作ったとでも思ってたんだろうか・・・
そっちのほうが、その関数の性質よく分かってるだろうから、ミスしないと思うんだが・・・
# それより、2chって意外かなぁ?
Re:タイトルが秀逸だったので張ります (スコア:0)
Re:タイトルが秀逸だったので張ります (スコア:1, 興味深い)
このゲームの作者は線形合同法のコードを自分で書いた上で % 6 したのでは?
参考: Linuxのrand(3)のman
推測ですがね。Re:タイトルが秀逸だったので張ります (スコア:0)
Re:タイトルが秀逸だったので張ります (スコア:0)
「自分が使ってる乱数生成ルーチンがどういう性質の乱数を発生させるのか」というのを意識できるかどうかがポイントだと思うよ。
意識した上で (乱数 % 6) + 1 で問題なければ、それでいいと思うし。
#意識できれば、実際に規則性が無いかどうかの動作検証くらいやるだろうしね。
下のレイヤーを意識できてないと、いろんな問題を発生させると思う。
Re:タイトルが秀逸だったので張ります (スコア:0)
たぶん、用意されている関数そのまま使っていて、意識してないんじゃないかな。
バグではあるけど、(乱数 % 6) + 1 も本来はコードとして間違いじゃない。
乱数については、言語(に用意されてる関数)のバグだよね。
(自分で乱数関数かいててのバグなら言い訳きかないが)
用意されてる乱数関数の下位ビットの信頼性が低い事がそもそもの問題なわけで。
言語マニュアルで"この言語の乱数の下位ビットは信用できません”なんて書いてる訳でもないし。
#もちろん、テストして見つけられなかったPG、テスタの責任がなくなるわけではない。
ほかのフリーズとかのバグは。。。。どうしようもないね。
Re:タイトルが秀逸だったので張ります (スコア:0)
信用できない事が分かっていれば書いていると思いますが。 例えばDarwinのマニュアルでは信用できない乱数 [hmug.org]には使うなと書いています。 「下位ビットは信用できません」はこっちを使え [hmug.org]とした方に書いてますけどね。
Re:タイトルが秀逸だったので張ります (スコア:0)
「下位ビットまで一様にランダムである」という明記されてるのに、実際はそうでなかったとかいうのなら乱数生成機のバグだと思うけど。
Re:タイトルが秀逸だったので張ります (スコア:0)
普通はマニュアルに書いてるだろ。よくいるんだよね、マニュアル読まずに書いてないって言うやつ。
Re:タイトルが秀逸だったので張ります (スコア:0)
まぁ、経験が少ないことは否定しませんが。
手持ちのJAVA
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html
EXCEL
0 以上で 1 より小さい乱数を発生させます。ワークシートが再計算されるたびに、新しい乱数が返されます。
書式
RAND()
解説
a と b の範囲で乱数を発生させるには、次の数式を使います。
RAND()*(b-a)+a
.net
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemrandomclasstopic.asp
Re:タイトルが秀逸だったので張ります (スコア:0)
あと、Javaのマニュアルには
> クラスでは 48 ビットのシードを使い、このシードは線形合同法で変更されます。
> 詳細は Donald Knuth 著『The Art of Computer Programming, Volume 2』の 3.2.1 を参照してください。
という記述がありますね。