我需要获取随机数,但它不应该等于之前的数字。这是我的一段代码。但这不起作用。
function getNumber(){
var min = 0;
var max = 4;
var i;
i = Math.floor(Math.random() * (max - min)) + min;
if (i=== i) {
i = Math.floor(Math.random() * (max - min)) + min;
}
return i;
};
console.log(getNumber());
最佳答案
这个答案提出了三种尝试
一个简单版本,具有函数
getNumber
、last
的属性,用于存储最后一个随机值。该版本对
min
和max
值使用闭包,如果max
小于则引发异常>分钟
。结合了闭包和保留所有随机值并在适当时使用它的想法的版本。
一个
您可以使用 getNumber
的属性来存储最后一个数字并使用 do ... while
循环。
function getNumber() {
var min = 0,
max = 4,
random;
do {
random = Math.floor(Math.random() * (max - min)) + min;
} while (random === getNumber.last);
getNumber.last = random;
return random;
};
var i;
for (i = 0; i < 100; i++) {
console.log(getNumber());
}
.as-console-wrapper { max-height: 100% !important; top: 0; }
两个
另一个提案,其中包含区间和最后一个随机值的闭包。
function setRandomInterval(min, max) {
var last;
if (min >= max) {
throw 'Selected interval [' + min + ', ' + max + ') does not work for random numbers.';
}
return function () {
var random;
do {
random = Math.floor(Math.random() * (max - min)) + min;
} while (random === last);
last = random;
return random;
};
}
var i,
getRandom = setRandomInterval(0, 4);
for (i = 0; i < 100; i++) {
console.log(getRandom());
}
setRandomInterval(4, 4); // throw error
.as-console-wrapper { max-height: 100% !important; top: 0; }
三
该提案使用的想法是最大限度地减少新随机数的调用。它使用两个变量,value
用于连续相同的随机值,count
用于保存相同值的计数。
如果给定了保存的计数并且该值不等于最后一个值,则该函数首先查找。如果发生这种情况,则返回保存的值并减少计数。
否则,将生成新的随机数并按上述方式进行检查(第一个提议)。如果该数字等于最后一个值,则计数会增加,并继续生成新的随机值。
因此,几乎所有先前生成的随机值都被使用。
function setRandomInterval(min, max) {
var last, // keeping the last random value
value, // value which is repeated selected
count = 0, // count of repeated value
getR = function () { return Math.floor(Math.random() * (max - min)) + min; };
if (min >= max) {
throw 'Selected interval [' + min + ', ' + max + ') does not work for random numbers.';
}
return function () {
var random;
if (count && value !== last) {
--count;
return last = value;
}
random = getR();
while (random === last) {
value = random;
++count;
random = getR();
}
return last = random;
};
}
var i,
getRandom = setRandomInterval(0, 4);
for (i = 0; i < 100; i++) {
console.log(getRandom());
}
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 随机数,不等于前一个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40056297/