我有以下代码,为宾果卡生成非重复的随机数。
为了让您理解,我还将放置相同的HTML代码:

window.onload = newCard;
var usedNums = new Array(76);


function newCard() {
    if (document.getElementById) {
        for (var i=0; i<24; i++) {
            setSquare(i);
        }
    }
    else {
        alert("Sorry, your browser doesn't support this script");
    }
}

function setSquare(thisSquare) {
    var currSquare = "square" + thisSquare;
    var colPlace = new Array(0,1,2,3,4,0,1,2,3,4,0,1,3,4,0,1,2,3,4,0,1,2,3,4);
    var colBasis = colPlace[thisSquare] * 15;
    var newNum;

    do {
        newNum = colBasis + getNewNum() + 1;
    }
    while (usedNums[newNum]);

    usedNums[newNum] = true;
    document.getElementById(currSquare).innerHTML = newNum;
}

function getNewNum() {
    return Math.floor(Math.random() * 15);
}


================================================== ================================

    <html>
<head>
    <title>Make Your Own Bingo Card</title>
    <link rel="stylesheet" rev="stylesheet" href="script.css" />
    <script type="text/javascript" src="script.js">
    </script>
</head>
<body>
<h1>Create A Bingo Card</h1>
<table>
    <tr>
        <th width="20%">B</th>
        <th width="20%">I</th>
        <th width="20%">N</th>
        <th width="20%">G</th>
        <th width="20%">O</th>
    </tr>
    <tr>
        <td id="square0">&nbsp;</td>
        <td id="square1">&nbsp;</td>
        <td id="square2">&nbsp;</td>
        <td id="square3">&nbsp;</td>
        <td id="square4">&nbsp;</td>
    </tr>
    <tr>
        <td id="square5">&nbsp;</td>
        <td id="square6">&nbsp;</td>
        <td id="square7">&nbsp;</td>
        <td id="square8">&nbsp;</td>
        <td id="square9">&nbsp;</td>
    </tr>
    <tr>
        <td id="square10">&nbsp;</td>
        <td id="square11">&nbsp;</td>
        <td id="free">Free</td>
        <td id="square12">&nbsp;</td>
        <td id="square13">&nbsp;</td>
    </tr>
    <tr>
        <td id="square14">&nbsp;</td>
        <td id="square15">&nbsp;</td>
        <td id="square16">&nbsp;</td>
        <td id="square17">&nbsp;</td>
        <td id="square18">&nbsp;</td>
    </tr>
    <tr>
        <td id="square19">&nbsp;</td>
        <td id="square20">&nbsp;</td>
        <td id="square21">&nbsp;</td>
        <td id="square22">&nbsp;</td>
        <td id="square23">&nbsp;</td>
    </tr>
</table>
<p><a href="script.html" id="reload">Click here</a> to create a new card</p>
</body>
</html>


“ while(used(usedNums [newNum]));”是否正确?正在检查数组中是否存在数字?
正确的说法是:“ usedNums [newNum] = true;”将数组中的项目设置为非零值?

如果以上两个问题是正确的,那我想知道,它如何生成非重复的随机数?

如果我将“ usedNums [newNum]”设置为false,则会生成重复数字,请您解释一下此语句的后端功能吗?

如果方便,还粘贴参考链接,我想对此进行详细研究。

最佳答案

我将尝试解释大块中会发生什么。

首先声明变量newNum

var newNum; //The value is undefined


然后使用do-while循环。为了简短起见,do-while循环的主要好处是它将始终至少执行一次。您可以阅读有关do-while循环here的信息。

do {
    //This will run at least ones.
    newNum = colBasis + getNewNum() + 1;
} while (usedNums[newNum]); //Here we check if the new number is all ready used.

usedNums[newNum] = true;


为了解释上面的代码片段,我将使用一个示例:


循环第一次运行,并生成数字3,因此newNum = 3
循环条件已检查,这意味着我们检查usedNums[3]处的值是否为true
因为这是我们第一次生成usedNums[3]undefined的数字,该数字被评估为false-这意味着循环退出。
现在,我们将usedNums[3]的值设置为true,表示已使用该数字。
我们尝试生成一个新数字。
循环第一次运行,并再次生成3作为新数字。
检查循环条件,并且因为usedNums[3]现在为true,所以循环再次运行。
这次循环生成56,并使用数字56而不是3重复步骤2-4。


我希望这可以澄清代码中发生的事情。

09-25 16:08