27

重複の可能性:
Javascriptで特定の範囲の乱数を生成しますか?

たとえば、0を除いて-99から99までのランダムな値を取得するにはどうすればよいですか?

4

3 に答える 3

58
var num = Math.floor(Math.random()*99) + 1; // this will get a number between 1 and 99;
num *= Math.round(Math.random()) ? 1 : -1; // this will add minus sign in 50% of cases

全体として

var ranNum = Math.ceil(Math.random() * 99) * (Math.round(Math.random()) ? 1 : -1)
于 2012-11-19T13:45:54.603 に答える
8

これはあなたが望むものを返します

function getNonZeroRandomNumber(){
    var random = Math.floor(Math.random()*199) - 99;
    if(random==0) return getNonZeroRandomNumber();
    return random;
}

これが機能的なフィドルです

編集

ユーザー@MarkDickinsonが投稿された最初のコードに実際に関連する貢献をしたコメントで少し議論が起こった将来の読者のために貢献するために、使用Math.floor()Math.round()関数をすばやく比較して値を返す別のフィドルを作成することにしました。 opが欲しかった。

最初のシナリオ:使用var random = Math.round(Math.random()*198) - 99;(私の最初の提案)

function getNonZeroRandomNumberWithMathRound(){
    var random = Math.round(Math.random()*198) - 99;
    if(random==0) return getNonZeroRandomNumber();
    return random;
}

2番目のシナリオ:(var random=Math.floor(Math.random()*199) - 99;マークの提案)を使用する

function getNonZeroRandomNumberWithMathFloor(){
    var random = Math.floor(Math.random()*199) - 99;
    if(random==0) return getNonZeroRandomNumber();
    return random;
}

方法論

短い議論なので、比較を行うためにfiddle.netを選択しました。

テストは、上記の関数を100.000回実行してから、極端な数が他の数に対して表示される回数99を取得することで構成されます。-9933-33

次に、テストにより、とからの出現のパーセンテージ99ととの出現のパーセンテージで構成される単純な出力が得られます。-9933-33

これは、からのWebkit実装を使用して、この回答からの出力を提供しますが、誰でもfiddle.netSafari 6.0.2の後半でお気に入りのブラウザーでテストできます。

最初のシナリオの結果:

  • 正常な発生の割合:0.97%
  • 極端な発生の割合:0.52%
  • 通常の発生に対する極端な発生の割合:53.4%//実際に発生する可能性の半分

2番目のシナリオの結果:

  • 正常な発生の割合:1.052%
  • 極端な発生の割合:0.974%
  • 通常の発生に対する極端な発生の割合:92%//標準偏差が最小の公正な結果に近い

結果はここで見ることができます:http://jsfiddle.net/brunovieira/LrXqh/

于 2012-11-19T13:49:10.347 に答える
3

これは、境界を設定し、を含めることをオプトイン/オプトアウトできる一般化されたソリューションです0

var pos = 99,
    neg = 99,
    includeZero = false,
    result;

do result = Math.ceil(Math.random() * (pos + neg)) - neg;
while (includeZero === false && result === 0);

posとのneg値は包括的です。

このように、正と負の範囲のバランスをとる必要はありません。


または、除外された単一の値が原因で再実行が心配な場合は、初期範囲を1つ小さくして、 。1以上の結果に追加することができ0ます。

var pos = 5,
    neg = 5,
    result;

result = Math.floor(Math.random() * (pos + neg)) - neg;
result = result < 0 ? result : result + 1;

必要に応じて、最後の行を短くすることもできます。

result += (result >= 0)
于 2012-11-19T14:03:47.387 に答える