【发布时间】:2012-05-02 23:29:12
【问题描述】:
我不明白为什么这个while 循环是无限的:
window.prevRandomNumber = -1;
function getRandomNumber(limit) {
if (!limit)
limit = 9;
var actualRandomNumber = Math.floor((Math.random() * limit) + 1);
while (window.prevRandomNumber == actualRandomNumber) {
actualRandomNumber = Math.floor((Math.random() * limit) + 1)
}
window.prevRandomNumber = actualRandomNumber;
return actualRandomNumber;
}
对此进行 QUnit 测试:
test("getRandomNumber() should never return the same number once and again", function () {
//http://www.askageek.com/2006/01/31/javascript-random-function-that-does-not-return-two-consecutive-identical-results/
var prevNumber, actualNumber, assertResult;
for (var i = 0; i <= 200; i++) {
actualNumber = getRandomNumber();
assertResult = prevNumber != actualNumber;
equal(assertResult, true);
if (!assertResult)
break;
prevNumber = actualNumber;
}
});
解决方案:
抱歉,错误出现在另一个测试中,就像@Jon 回答的描述,当 anyNumber 等于 1 时,会发生无限循环:
test("getRandomNumber(anyNumber) should return a number between 1..anyNumber", function () {
var anyNumber, result;
for (var i = 0; i <= 100; i++) {
anyNumber = Math.floor((Math.random() * 9) + 1);
result = getRandomNumber(anyNumber);
equal((0 < result && result < (anyNumber + 1)), true);
}
});
【问题讨论】:
-
limit的值是多少?例如,如果limit == 1,那么由于简单的数学运算,它是一个无限循环。 -
旁注:如果您使用 do...while 循环,您可以使代码更加干燥。
标签: javascript while-loop qunit