https://codepen.io/quanahquan/pen/qmvYEq?editors=1010
var resultArray = [];
function pickRandom(){
var min = parseInt(document.getElementById("min").value);
var max = parseInt(document.getElementById("max").value);
var result = Math.floor((Math.random() * max) + min);
if (resultArray.includes(result))
{
pickRandom();
}
if (resultArray.length === max)
{
alert("you ran out of number");
}
else
{
resultArray.push(result);
document.getElementById("result").value = result;
}
}
大家好......我无法理解这个背后的逻辑
我有2个IF语句,但在这种情况下,如果我将resultArray.length === max IF语句放在第二个,它将导致不良结果,例如在所有48个数字被随机选择之前被触发
如果我先放置resultArray.length === max IF语句,那么它会在发出警告之前选择所有48个数字......
答案 0 :(得分:1)
在我看来,这种算法效率不高。对于大数字,它将花费大量时间来找到缺失的空白。想象一下max
是1,000,000,算法到目前为止生成了999,999个数字。它将继续产生随机数,直到经理找到丢失的数字,这将花费很多时间。
我更新了你的代码,使其能够使用递归调用。它用于学习,而不是用于实际应用。
var resultArray = [];
function pickRandom() {
// Warning: min and max should't change between calls
var min = parseInt(document.getElementById("min").value);
var max = parseInt(document.getElementById("max").value);
// result is in the interval [min, max]
var result = Math.round((Math.random() * (max - min)) + min);
// Do we have too many items in resultArray?
if (resultArray.length === max - min + 1)
{
alert("you ran out of number");
}
else if (resultArray.includes(result))
{
// Already chosen, pick another number
// Warning: going recursive is not efficient
pickRandom();
} else {
// Is a new number. Store it and show it.
resultArray.push(result);
document.getElementById("result").value = result;
}
}
您的代码中出现的一些错误:
Math.round((Math.random() * (max - min)) + min)
(resultArray.length === max - min + 1)
,在您的代码中忘记减去min if
都会执行。因此,即使已在该数组中找到它,它也会向resultArray添加一个值。答案 1 :(得分:0)
您有两个输入 min 和 max 。您还可以创建一个数组列表 - resultArray 。每当您选择一个幸运号码时,它会检查该号码是否在该列表中。在开始时它根本不会进入第一个 if ,因为它是空的或获得相同数字的机会非常低。实际上你不需要第一个 if 语句,因为它会执行你的onclick事件调用。
第二个 if 语句检查长度是否等于最大值。如果是,那么你不能选择更多的幸运数字并且每次都能得到警报。