— boreal-kiss.com

[FLASH]Math.random()の頻度分布

various functions with different distributions for Math.random() « Pixeleroで興味深いことをやっていたのでFlashで実践。Math.random()の頻度分布は0以上1未満の範囲でだいたいフラットな形状になる。じゃあ例えばこれは?

f = (Math.random()+Math.random()+Math.random()+Math.random()) / 4

フラットな頻度分布にならず0.5近傍に頻度のピークがくる。なんでだろ。パっと理由が思いつかない。以下にデモとActioScriptソース等。横軸が関数の返す値、縦軸が頻度でスライダーをいじると関数形が変わります。

[Flash]ランダム関数頻度分布

[追記:2008/06/08]

言及されていた。[ActionScript3.0](標準)正規分布乱数 | moriBlog
中心極限定理というらしい。ちなみにMath.random()を10万回足し合わせて10万で割ると値はほぼ0.5。相対誤差0.1%未満になる。Math.random()だけを使って特定の数値を作ることが可能なわけだ。

[追記:2008/06/09 11:00]

Flex版を作成した。グラフ作成なんかはFlexで作るのが簡単でいいかも。ただファイルサイズがでかくなるのがネック。

[Flex]ランダム関数頻度分布その2

5 comments
  1. moringo says: 2008年6月11日7:04 PM

    乱数をn回加算してnで除算した値が、乱数の中心の値になる確率が高いのは、
    厳密には中心極限定理ってので証明できるんですが、
    直観的なイメージとしては、
    例えば4回Math.random()をやると、
    乱数だけに値が散らばる傾向(0.2, 0.4, 0.6, 0.8みたいな)にあって、
    n/2という和になりやすいって感じでしょうか。

    1に近い値と0に近い値が同確率で出現するというか。。。。

    わかりにくいですね。。。。

  2. admin says: 2008年6月11日10:58 PM

    わざわざ補足ありがとうございます。が、今イチイメージが湧きませんでした。サイコロを振って6の目が出る確率が試行回数増やしていくと1/6にどんどん近づいて行くっていうやつですかね。

  3. moringo says: 2008年6月12日1:10 AM

    すいません、逆にわかりづらくて;;

    おっしゃる通り、
    ベースになるのは、回数重ねると6の目が1/6ででるっていう大数の法則ですよね。
    math.random()を何回もやると0〜1の間に均等に値が散らばるので、
    その期待値(平均値)は0.5になるってことですね。

    よけい混乱させてすいませんでした。。。。

  4. admin says: 2008年6月12日1:28 AM

    ああなるほど。それだとサイコロの場合と同じ考えですね。

  5. saz says: 2008年6月22日5:40 AM

    サイコロを2つ振って、合計した数の分布を考えよう。

Submit comment