-1

可能な値の配列からいくつかの数値をランダムに出力しようとしています。

私が抱えている問題は再帰にあるため、ランダムに生成された数値が既に使用されているかどうかをチェックする関数が、数値が既に使用されている場合 (および可能な値の配列に含まれていない場合) に再び開始されます。

私も理解していない無限ループを取得します。

これが私のコードです:

<!DOCTYPE html>
<html>
<head>
<title></title>
<script>
    // Global array of possible numbers
    var possibleNumbers = [1, 2, 3, 4];

    // Check if element in the array
    function inArray(needle, haystack) {
        var length = haystack.length;
        for(var i = 0; i < length; i++) {
            if(haystack[i] == needle) return true;
        }
        return false;
    }

    // Random number between 1 and 4
    function genRand(){return Math.floor(1+ (4 * Math.random()));}

    // Return an random number from the possible numbers in the global array
    function randNumFromArray() {
        var generatedNum = genRand();
        console.log('possibleNumbers so far:' + possibleNumbers);
        console.log('generatedNum: ' + generatedNum);

        // Restart as long as the number is not in the array (not already used)
        while(inArray(generatedNum,possibleNumbers) === false) {
            console.log('Generating again...');
            randNumFromArray();
        }

        console.log('generatedNum not used yet, using it');

        // Use that number and remove it from the array
        var index = possibleNumbers.indexOf(generatedNum);
        if (index > -1) {
            possibleNumbers.splice(index, 1);
        }

        console.log('Removing the number from the array');
        console.log('possibleNumbers after removal:' + possibleNumbers);
        return generatedNum;
    }

    // Calling the function 4 times to get the 4 possible numbers in a random order 
    randNumFromArray();
    randNumFromArray();
    randNumFromArray();
    randNumFromArray();
</script>
</head>
<body>
</body>
</html>
4

1 に答える 1

0

コードをデバッグしましょう。

  1. Math.random() // Returns a random number between 0 (inclusive) and 1 (exclusive)

  2. 4 * Math.random() // will be number either be 0 or 4 < number < 5.

  3. 1+ (4 * Math.random()) // In your Case you are probably waiting for Math.random() to generate 0 which of least probability (because any number other than zero will make the total sum to 5.xx)

  4. Math.floor(1+ (4 * Math.random()) // will surely not be in your list [1, 2, 3, 4]; if number generate > 0 then will cross 4 so It will loop continuously

特定の範囲の乱数を生成したい場合は、

/**
 * Returns a random number between min and max
 */
function getRandomArbitary (min, max) {
    return Math.random() * (max - min) + min;
}

特定範囲の乱数生成の参考

于 2013-09-25T13:28:45.267 に答える