ランダムに選択する

wrote2007.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までのランダム整数は:   です。

function RandomValue(num){
var random_value = Math.floor(Math.random()*num);
if(num == random_value){random_value = random_value - 1;}
return random_value;
}
document.write(RandomValue(8));