JavaScriptのMath.random()の仕様について

[上に] [前に] [次に]
無責任官庁 [E-Mail] 1999/05/11(火) 16:15:16
とほほさんのリファレンスによると、Math.random()は、
”乱数(0〜1)。”となってます。
これにちょっと疑問を感じたので調査してみました。
その結果・・・

ネットスケープ(英語)では、
 ”between 0 and 1.(0と1との間の数)”
となってました。from〜toではなくbetweenを使っている事から、
0も1も含まない、と考えるのが正しいのではないでしょうか。
(ちなみに、私は英語はからっきしですので(^_^;))

マイクロソフトでは、
 ”0 〜 1 の範囲内の値をとります (0 および 1 も含まれます)”
と、明記されておりました。

他のリファレンスサイト(一撃必殺)では、
 ”0から1未満の乱数を発生させます。”
となってました。

実際に使用した感じでは”0から1未満”が正しいように思えますが、
本当の所はどうなのでしょう?
誰かがあってる、間違ってるや、実はメーカやバージョンで違う、
など、知っている方がおりましたら、教えてください。

みんこ 1999/05/13(木) 10:21:28
独学JavaScriptの作者の本では
「0から1の実数を発生させます」
とあります。その後に続くサンプル説明で
「最初の値が0の時は〜」とあるので0は含まれているようです。
見た感じでは1も含まれているような気がします。

英語のbetweenは
A |←このあいだ→| B
ではなくて
| A ←このあいだ→ B |
という気がします。
choose  between A and Bなら「AかBか」だし。
歯磨き粉のCM見てると歯の間だけを指している感じですが
ホントは歯も含まれるだろう、とかそんな感じ。(何なんだ)

ですが、今周りのプログラマに聞いたらみんな口を揃えて
「1を超えない小数を返す」とゆってます。
つまり0を含んで1未満の小数だそうです。
理由は、
「ここ10年そんなプログラムは見てない」とか
「処理の仕方が変わるからやらないだろう」とか
「0があるなら1入れると処理が出来ない」とか。
...意味はわかりませんが...。

使っている感じでは私も「0以上1未満」ととらえてました。
IEとNNとかWinとMacで処理が違っていたらやだなあ。

maeda [E-Mail] 1999/05/13(木) 14:32:20
C言語にせよ、BASICにせよ、乱数発生は「0以上1未満」という仕様
になっています。JavaScriptの設計者がよっぽどのひねくれ者でもな
い限り、これと同じなのではないでしょうか?

匿名希望 1999/05/13(木) 16:57:33
 JavaScriptでどういう値を取るかは存じ上げませんが、私もmaedaさんと同意見です。

 ちなみに一般的に乱数発生が「0以上1未満」となっているのは、例えばm〜nの数値を
ランダムに発生させたいとき、BASICなら
    RND(1)*(m−n+1)+n
とする訳ですが、乱数発生で1が出るとなると、これがわずかな確率でm+1になる場合も
あり都合が悪くなってしまうわけです。これが0以上1未満なら、m〜nが等確率で出ます。

無責任官庁 1999/05/13(木) 16:58:57
みんこさん、ありがとうございます。betweenの件は了解しました。
#あれって歯ブラシでしたよね?まあどうでもいいか。(^_^;)

私自身プログラマですので、普通の考えでは「0以上1未満」
というのは分かるのですが・・・
乱数発生アルゴリズムについて調べてみた所、パソコンの最大値
(2の32乗)個数の乱数を発生させようとした場合、
計算上0<=rnd<=1となってしまう事が判明しました。
0〜(2の32乗)−1の乱数を、2の32乗で割れないから、
というだけですが・・・(2回以上割り算を繰り返せば不可能では無いですが)

まあ、仮に1も含むとしましょう。その場合、
a = Math.floor(Math.random() * 10)
とした場合、0〜9の各数値の発生確率は、約1/10程で、
10の発生確率だけが1/(2の32乗)となってしまいます。
そんな確率では、”1”が含まれない感じがするのも無理ないですけど・・・

匿名希望 1999/05/13(木) 17:00:13
 あ、正確にはm〜nの整数で、
    INT(RND(1)*(m−n+1)+n)
ですね。(ちなみに子供の頃やったMSXBASICの話なので、N88BASICでは
違うかもしれないけど…ま、細かい事はいいでしょう。)

匿名希望 1999/05/13(木) 17:02:45
 あ、みんこさんへの解説だったけど、元の質問者の方がより詳しく精密に
解説してくださってますね。無責任官庁さん、失礼しました。

みんこ 1999/05/13(木) 18:18:44
え〜と。
頭の弱い私にみなさんが親切に教えて下さっているという感じです。ありがたいことです。
(てゆーかプログラムの基礎なんて見たことも聞いたことも。)

なんとなくみなさんが言っていることは分かりました。
で、本題について、確率だけでいえば、出る訳ですね、1が。
ということはマイクロソフトが正しいんでしょうか。
ネットスケープも同じ事言っているわけですしね。(多分)
(それはつまり JavaScriptの設計者がひねくれものだと...?)

後ろのプログラマさんたちは
「10年以上前の、プログラム言語がまだ方言だらけだった頃、
そういうのもあったなあ」といっています。その仲間なんでしょうか。
(ただうちの中でもJSやってるのは基礎知識の一切ない私だけなんですね。これってどうよ。)

maeda [E-Mail] 1999/05/13(木) 18:39:28
乱数発生で1が出る確率について

・数学的思考
「確率的には存在する」

・化学的思考
「あ〜、そんなのちっちゃいちっちゃい、無視無視」

・博打的思考
「可能性がある以上、出るか出ないかの2分の1」

・・・後はプログラマの感性次第ですねぇ(笑)。
ちなみに、私は2番目のやつです。

roland [E-Mail] 1999/05/14(金) 00:43:37
私はどれかっていうと「数学的思考」なので、例えば
 var num = 5;
 var R = Math.floor(Math.random() * num * 1000) % num;
って感じで5が出ないように逃げてみたり(^^;

無責任官庁 1999/05/14(金) 10:24:24
[[解決]]
色々調べてみた結果、ブラウザのメーカ・バージョンによって、
アルゴリズムもそれぞれ違う事が分かりました。
”0〜1”ってだけでも怪しいのにこれでは・・・(-_-;)
(NN3とNN4だけでも、かなり違うらしい)

結局の所、「自分で乱数発生ルーチンを作る」がベスト、
という結論に達しました。
皆さん、いろいろご意見ありがとうございました。

[上に] [前に] [次に]