このサイトについて

random()とrandom()*random()はどっちがランダムか?

random()とrandom()*random()はどっちがランダムか?

stackoverflowで見つけた乱数に関する質問「乱数のランダムさって?」に対する解答が面白かったので紹介します。

乱数のランダムさというのは,沢山標本をとったときに,標本値がまんべんなく均等に分布する,ということ。プログラミング言語などに組み込まれた乱数を発生する仕組みが返す値が均等に分布してないと,テトリスでなかなか長い棒が落っこちてこなかったりするわけです。

数学的な詳細はともかく,こういう知識はプログラミングをする上で知って置いた方がよいと思います。

さて,質問の内容は

random()とrandom()×random()のどっちがランダムなの?

というもの。後者はrandom()をさらにrandom()にしてるっぽいのでよりランダムになるんじゃないかとも思えますが,実際は違う。回答者のbelisariusさんは図を使って分かりやすく答えています。曰く,

キミの質問は疑似乱数生成関数の返す値と,返す値を掛けたもののどっちがランダムかってことだと思う。まずキミが知っておくべきなのは,たいていの疑似乱数は均等分布で,乱数を掛けたものはそうでない,ということだ。

たとえば,これは疑似乱数の値の分布をグラフ化したもの。

一方,乱数どうしを掛けた場合は,分布は均等にならない。

どちらもランダムだけど,値の分布が違っているのが分かる。

別の例。乱数を二倍したものの分布は均等。

だけどrandom() + random()のように乱数同士を足し算すると均等でなくなるんだ!

なかなか面白いですね〜:-)。

2011-06-02 09:20