2

ユーザー指定の数値範囲 (-9999 ~ 9999) とユーザー指定の桁数制限 (1 ~ 4 桁) 内で完全にランダムな整数 (非常に重要) を生成する関数が必要です。

例 1: ユーザーが -9999 ~ 9999 の 4 桁の数字を希望する場合、-9999 ~ -1000 および 1000 ~ 9999 の数字が有効な選択肢になります。

例 2: ユーザーが 25 から 200 までの 2 桁または 3 桁の数字を希望する場合、次の数字が 25 から 200 の選択肢として適切です。

機能する関数を書きましたが、それが最善の解決策かどうかわかりませんか? 重複したコードがあり、完全にランダムではないと思いますか?

// Generates a random integer
// Number range
// Min (-9999-9999)
// Max (-9999-9999)
// Digit limit
// Min (1-4)
// Max (1-4)

function generateRandomInteger(minNumber, maxNumber, minDigits, maxDigits) {    

// Generate a random integer in the number range
var num = Math.floor(Math.random() * (maxNumber - minNumber)) + minNumber;

// Find number of digits
var n = num.toString();
n = n.length;

// If number is negative subtract 1 from length because of "-" sign
if (num < 0) {
    n--;
}
// End: find number of digits


while ((n > maxDigits) || (n < minDigits)) {
    // Generate a random integer in the number range
    num = Math.floor(Math.random() * (maxNumber - minNumber)) + minNumber;


    // Find number of digits
    var n = num.toString();
    n = n.length;

    // If number is negative subtract 1 from length because of "-" sign
    if (num < 0) {
        n--;
    }
    // End: find number of digits
}

return num;
}
4

2 に答える 2

1

さて、これはまったく同じ方法を引き続き使用する関数のバージョンです(つまり、正しい桁数の数値を取得するまで数値を生成し続けます)が、コードの重複が排除されています。

function generateRandomInteger(minNumber, maxNumber, minDigits, maxDigits) {
    var num, digits;
    do {
        num = Math.floor(Math.random() * (maxNumber - minNumber)) + minNumber;
        digits = Math.abs(num).toString().length;
    } while (digits > maxDigits || digits < minDigits);
    return num;
}

これが本当にランダムかどうかについての懸念については、このMath.random()メソッドは「疑似乱数」の数値を返しますが、少なくとも現在のすべてのブラウザーで機能することはわかっています。

于 2012-11-14T06:22:08.860 に答える
1

この機能的アプローチを試してください。配列を作成してランダムにシャッフルし、「非常にランダムな」結果が得られます。私は非常に満足のいく結果で以前にそれを使用しました。

function getLen( v ) { 
  return Math.abs( v ).toString().length; 
};
function randomInteger( min, max ) {
  return ( new Array( ++max - min ) )
    .join('.').split('.')
    .map(function( v,i ){ return [ Math.random(), min + i ] })
    .filter(function( v ){ return getLen( v[1] ) >= getLen( min ) })
    .sort().map(function( v ) { return v[1] }).pop();
}
于 2012-11-14T06:31:35.460 に答える