JavaScriptのMath.randomはどれくらいランダムですか?


116

6年間、自分のWebサイトに乱数ジェネレーターのページを置いてきました。長い間、これは「乱数ジェネレーター」に関するGoogleでの最初または2番目の結果であり、ディスカッションフォーラムやブログで何百とは言わないまでも数十のコンテストや描画を決定するために使用されてきました(ウェブログと通常は見てください)。

今日、誰かが思ったほどランダムではないかもしれないと私に電子メールで送ってきました彼女は非常に大きな乱数(たとえば、1〜10000000000000000000)を生成しようとしましたが、ほとんど常に同じ桁数であることがわかりました。確かに、私は関数をループでラップしたので、数千の数を生成でき、非常に大きな数の場合でも、変動は約2桁しかありませんでした。

どうして?

これはループバージョンですので、自分で試すことができます。

http://andrew.hedges.name/experiments/random/randomness.html

これには、Mozilla Developer Networkから取得した単純な実装と、存在しないWebページ(Paul Houleの「Central Randomizer 1.3」)をスワイプした1997年のコードの両方が含まれています。ソースを表示して、各メソッドの動作を確認します。

私はここ他の場所でメルセンヌツイスターについて読みました私が興味を持っているのは、JavaScriptの組み込みMath.random関数からの結果に大きなばらつきがない理由です。ありがとう!


「sarnath'd」のように、パンチ、またはこの場合は答えに
打ち勝つ

5
タイトルの質問への回答を探している場合は、stackoverflow.com
Andrew B.

回答:


182

1から100までの数値を指定します。

  • 9は1桁(1-9)
  • 90は2桁(10-99)
  • 1は3桁(100)

1から1000までの数値を指定します。

  • 9は1桁
  • 90は2桁
  • 900は3桁
  • 1は4桁

等々。

したがって、いくつかをランダムに選択すると、選択可能な数値の大部分は同じ桁数になります。これは、可能な値の大部分が同じ桁数であるためです。


11
ランダム性の意味が完全かつ均等に分散しているというあなたの考えは興味深いものです...

19
@ R.Pate-乱数生成は、長いスケールで均等に分散されない限りあまり役に立ちません
アナカタ09年

3
もう一度お読みください。@Davidは、Nの乱数を選択した結果ではなく、制限の間にある数値の種類のみを示しています。タイトルは誤解を招くものであることは認めます。
nikc.org 2009年

3
記録として、私はこれと@jwoolardの回答の両方に賛成票を投じました。例では、数値の分布が桁数の多い数値に偏っている理由が非常に明確であるため、これを受け入れられた回答として選択しました。
アンドリューヘッジス

1
@ andrew-
hedgesは

56

あなたの結果は実際に期待されています。乱数が1〜10 ^ nの範囲で均一に分布している場合、約9/10の数値がn桁であり、さらに9/100がn-1桁であると予想されます。


8
丁度。桁数の分布が歪むことが予想されます。ただし、桁数の対数の分布は均一でなければなりません。
ノルドリン2009年

45

ランダム性にはさまざまなタイプがあります。Math.randomは、数値の均一な分布を提供します。

異なる桁数が必要な場合は、指数関数を使用して、べき乗則分布と呼ばれるものを作成することをお勧めします。

function random_powerlaw(mini, maxi) {
    return Math.ceil(Math.exp(Math.random()*(Math.log(maxi)-Math.log(mini)))*mini)
}

この関数は、2桁の数値および3桁の数値とほぼ同じ数の1桁の数値を提供します。

正規分布(ガウス分布とも呼ばれる)のような乱数の他の分布もあります。


このアルゴリズムでは、私が入れminimum = 1maximum = 10、時には、結果として11を得るでしょう。あなたはおそらくMath.floor代わりに使用するつもりでしたMath.round
Sam Eaton

1
なぜ機能するのですか?均一分布を指数分布に変換しますか?
しんぞう2017

@shinzou私は上尋ねmath.stackexchangeと答えとしてわずかに異なる式を得ました。math.stackexchangeから数学的に導出された式を反映するようにコードを変更しました。
クリスチャン

20

私には完全にランダムに見えます!(ヒント:ブラウザーに依存します。)

個人的には、常に認められるべきであるXKCDからそれを盗みましたが、私の実装はより良いと思います:

function random() {
  return 4; // Chosen by a fair dice throw. Guaranteed to be random.
}

19
ブラウザーに依存することを言及する場合は+1、リンクなしでxkcdを借用する場合は-1。

必須かどうか、それはxkcdであるため、属性が付けられます。:)
アラファンギオン2009年

2
OT:「XKCD」が今週のユニバーシティチャレンジの質問への答えであったことに驚いて嬉しく思います:D
Matt Sach

2
ベルギ:直接リンクでは不十分ですか?
アラファンギオン2013年

私はそれらが冗談が正しく引用されなかったことを意味すると思います( "return 4;"の代わりに "random = 4;")
Eren Tantekin

18

以下の論文は、主要なWebブラウザでmath.randomは、()(UN)である方法を説明確保: クライン(2008)のなかの「主要なブラウザとクロスドメインの情報漏えいや攻撃の一時的なユーザ追跡」。これは、典型的なJavaまたはWindowsの組み込みPRNG関数よりも強力ではありません。

一方、期間2 ^ 19937-1のSFMTを実装するには、PRNGシーケンスごとに2496バイトの内部状態を維持する必要があります。一部の人々はこれを許されない費用とみなすかもしれません。


1
+1:言及された論文は素晴らしく、元の質問の内容をはるかに超えています。
Roland Illig

6

10000000000000000000のような数値を使用すると、JavaScriptが使用しているデータ型の精度を超えてしまいます。生成される数値はすべて「00」で終わることに注意してください。


1
しかし、この場合は彼の問題ではありません。
ジョーイ

3
@ヨハネス-それは彼の問題の1つです:)
アナカタ09年

IEE754の分布は均一ではありません。たぶん、0から999を2の増分で表すことができ、そのために十分な精度があるため、数を何度も選択すると、その範囲全体に均等に分布していることに気付くでしょう。10%は2桁、90%は3桁です。ただし、非常に高い数をヒットし始めると、増分は1を超えます。1兆10億から1兆ではなく、1兆10億から1兆10億までしかステップできない場合があります。小さい数/スケールの場合でも、この影響は存在しないほど無視できます。ただし、スケール効果ははるかに大きな影響を与えます。
jgmjgm

5

Chaos Gameで JS擬似乱数ジェネレーターを試しました。

私のシェルピエスキーの三角形はかなりランダムだと言っています: フラクタル


2
ここで三角形のコードとjsfiddle / jsbinを共有して、実際にさまざまなブラウザーで簡単に確認できるようにしていただけませんか?
FABRICIOマット

1
わかりましたが、コードを英語に翻訳する必要があるため、数日お待ちください。今はポーランド語-英語で、たくさんの仕事をしています。
zie1ony 2013年

1
@ zie1ony数日が終わりました。
trusktr 2013

1
usp :( work、work、workリンク:kubaplas.vot.pl/green/fractal最初のパラメーターは頂点のnrです。2番目のパラメーターはラインセグメントの交点(0から1)です。実験してください
zie1ony

4
リンクが死んでいる-多分代わりにGithubリポジトリ?
Mark K Cowan 2016

3

ええと、たとえば1e6までの数値を生成している場合は、ほぼ同じ確率ですべての数値を取得できます。つまり、1桁少ない数値を取得できる可能性は10分の1しかありません。2桁減る100分の1の確率などです。別のRNGを使用すると、対数ではなく数値全体に均一な分布があるため、大きな違いは見られないでしょう。


0

1からNまで一様に分布する非乱数は同じ性質を持っています。(ある意味では)精度の問題であることに注意してください。0〜99の一様分布(整数として)では、その数字の90%が2桁です。0〜999999の一様分布では、905の数が5桁です。

数値のセット(制限が厳しくない場合)には密度があります。誰かが「ランダムな」数値について議論したい場合、これらの数値の密度を指定する必要があります(上記のとおり)。一般的な密度は均一密度です。他にも、指数密度、正規密度などがあります。乱数発生器を提案する前に、関連する密度を選択する必要があります。また、ある密度から得られた数値は、さまざまな方法で別の密度に簡単に変換できることがよくあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.