1

maxの偏りを防ぐために、小数の範囲がmaxを超えるたびに、小数を取り除くのではなく、再計算しています。random()を使用すると、多少の偏りが生じると思いますが、それは許容範囲です。

オプションの arg decimalは、含める小数点以下の桁数を示す整数です。

オプションの arg excludeは、結果から特定の数値 (通常は 0) を除外するのに便利です。

すべての引数が省略された場合、オプションで true または false をランダムに返します。

基本的に、バイアスを追加したり、バイアスを減らしたりせずに速度と効率を上げる方法があるかどうか疑問に思っています。while ループが遅くなる可能性があるようです。私はこれをアニメーションに使用していますが、偏った結果を望んでいません (特に 1.0 から 2.0 のような小さな範囲では)。

function random(min, max, decimal, exclude) {
    if (min == null) return (Math.random()*2 >= 1) ? true : false
    var decimal = (decimal == null) ? 1 : Math.pow(10,decimal), result = exclude
    while (result == exclude) {
        result = max+1
        while (result > max) var result = Math.round((Math.random()*(max-min+1)+min)*decimal)/decimal
    }
    return result
}
4

2 に答える 2

1

分布は均一であるため、数値が範囲外になった場合に繰り返す代わりに、疑似乱数をスケーリング/移動できます。

var rand = Math.random() * (max - min) + min;

これにより、while ループの 1 つが削除され、コードが高速化されます。

于 2013-03-24T02:15:45.527 に答える
1

これは少しクリーンな実装です:

function random(min, max, decimal, exclude) {
    // if no min and max is passed, return true or false
    if (arguments.length < 2) return(Math.random() >= 0.5);

    // calc decimal multiplier
    var factor = 1, result;
    if (typeof decimal === "number") {
        factor = Math.pow(10, decimal);
    }

    // loop until we get a value that isn't our exclude value
    do {
        // calc rand value in proper range
        result = Math.random() * (max - min) + min;

        // adjust to proper number of decimal digits
        result = Math.round(result * factor) / factor;
    } while (result === exclude);
    return result;
}

小数を使用したデモ: http://jsfiddle.net/jfriend00/SjgaW/

整数としての動作デモ (除外値あり): http://jsfiddle.net/jfriend00/GgkJv/

変更点:

  1. ローカル変数を引数と同じ名前に変更decimalして、引数が機能するようにします
  2. 適切な範囲スケーリングを使用して while ループを 1 つ削除する
  3. do/while に変更して、計算後まで条件がテストされないようにする
  4. ===型変換を避けるために使用します
  5. 比較はすでに真/偽を返すため、真/偽の計算から乗算と三項演算子を削除します
  6. 引数を渡す必要のない、またはへの型変換に依存しない、より明示的な引数のチェックnull
  7. 関連するコメントを追加
于 2013-03-24T02:58:41.427 に答える