我有以下代码为宾果卡生成非重复随机数。 为了便于您理解,我也在使用相同的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"> </td>
<td id="square1"> </td>
<td id="square2"> </td>
<td id="square3"> </td>
<td id="square4"> </td>
</tr>
<tr>
<td id="square5"> </td>
<td id="square6"> </td>
<td id="square7"> </td>
<td id="square8"> </td>
<td id="square9"> </td>
</tr>
<tr>
<td id="square10"> </td>
<td id="square11"> </td>
<td id="free">Free</td>
<td id="square12"> </td>
<td id="square13"> </td>
</tr>
<tr>
<td id="square14"> </td>
<td id="square15"> </td>
<td id="square16"> </td>
<td id="square17"> </td>
<td id="square18"> </td>
</tr>
<tr>
<td id="square19"> </td>
<td id="square20"> </td>
<td id="square21"> </td>
<td id="square22"> </td>
<td id="square23"> </td>
</tr>
</table>
<p><a href="script.html" id="reload">Click here</a> to create a new card</p>
</body>
</html>
是否正确,&#34; while(usedNums [newNum]);&#34;正在检查数组中是否存在数字? 这是正确的,&#34; usedNums [newNum] = true;&#34;将数组中的项设置为非零值?
如果以上两个问题都是正确的,那么我想知道,它是如何产生非重复随机数的?
如果我制作&#34; usedNums [newNum]&#34;如果为false,它会生成重复的数字,请您解释一下这个语句的后端功能吗?
如果方便,也粘贴参考链接,我想详细研究一下。
答案 0 :(得分:2)
我会尝试解释块中发生的事情。
首先声明变量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;
为了解释上面的代码片段,我将使用一个例子:
newNum = 3
。usedNums[3]
的值是否为true
。usedNums[3]
是undefined
,它会对false
进行评估 - 这意味着循环退出。usedNums[3]
的值设置为true
,表示该号码已被使用。usedNums[3]
现在为真,循环再次运行。我希望这能澄清代码中发生的事情。
答案 1 :(得分:1)
第一个陈述是正确的。
因为Javascript是一种弱类型语言,所以您可以进行跨类型比较。
如果某个对象不未定义,并且您对其进行了布尔比较,则它将返回true
。
(反之亦然)
由于true
不是undefined
,第二个陈述也是正确的。
如果将usedNums[newNum]
设为false,则会重复数字的原因也与此有关。
当usedNums[newNum]
等于false
或undefined
do {
newNum = colBasis + getNewNum() + 1;
}
while (usedNums[newNum]);
其余的,这不完全是火箭科学。
如果您想知道它是如何生成随机数的,请查看function getNewNum
(因为它使用Javascript的Math.random()
函数正是如此)
为了更好地理解“弱类型”的含义,我建议this wikipedia article on weakly typed vs strong typed