ホーム > マークアップ > Javascript > ランダムに選択する
ランダムに選択する
- 公開日
- 2007年03月11日
var sentaku = Math.floor(Math.random()*8);
document.write(sentaku);
0から7までの数字の中から任意に抽出し書き出す。
1から8までの任意の数字を書き出ししたい時は
var sentaku = Math.floor(Math.random()*8)+1;
と記述すればよい。
random(); 0から1までの値をランダムに返すっていうけど・・・
「1」は含まれるのか?
書籍、Webでの検索結果によって微妙に異なります。また、あいまいな説明に留まっています。でも大概は「0以上1未満」という認識が強いようですが、ほんとでしょうか?というのも、想定外の結果を引き出したことがあったもので・・・。というのも「1」が返ってきたことがあるのです。自分なり出した結論があります。
結論:「ブラウザによって解釈が違う」
困りました。今後登場する主ブラウザはJavascriptの仕様はEcmascriptに準拠するようにすると発表していますので、ブラウザ対応は必要ないのでしょうが、現時点では、クロスブラウザに対応する必要があるように思います。
そもそも、Ecmascriptの仕様にはどのように記述されているのでしょうか?抜粋します。
- random( )
- Returns a number value with positive sign, greater than or equal to 0 but less than 1, chosen randomly or pseudo randomly with approximately uniform distribution over that range, using an implementation-dependent algorithm or strategy. This function takes no arguments.
- 実装依存のアルゴリズムまたは手順で、ランダムに、または擬似的にランダムに、おおよそ一定の配分で選ばれる 0 以上 1 未満の正符号の数値を返す。この関数は引数をとらない。
なるほど。やはり、一般的に言われてるように、random()は、「0以上1未満のランダムな値を返す」が正しい解釈です。
しかしながらレガシーブラウザでは、ブラウザ独自の解釈で「1以下」になっている場合がある、のも事実です。
そこで、クロスブラウザ対応のスクリプトサンプルを考えます。発想は単純で、もし「1」が返ってきたら「0.999」が返ってきたことにしちゃうということをベースにしています。このサンプルでは、ランダム整数が返ってくるサンプルですので、「1」が返ったことにより、期待する最大整数+1になってしまった場合は、最大整数+1-1するという感じ。
サンプル
0から7までのランダム整数は: です。
var random_value = Math.floor(Math.random()*num);
if(num == random_value){random_value = random_value - 1;}
return random_value;
}
document.write(RandomValue(8));
- 参考サイト
- ECMA 262規格(http://www.ecma-international.org/publications/standards/Ecma-262.htm)
- ECMA 262和訳(http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/)
- この記事に関するご意見・ご感想をお待ちしております。
- コメントNo.1
random()について追求してみました〜
コメントの削除はお手数ですが、contact@allinthemind.bizまでご連絡ください。
- この記事のトラックバックURL
- トラックバックは終了115