我有一个数字在 1-3 之间的变量。
我需要在 1-3 之间随机生成一个新数字,但它不能与最后一个相同。
它循环发生数百次。
这样做最有效的方法是什么?
愿模运算的力量帮助你!
此函数使用模运算符执行您想要的操作:
/**
* generate(1) will produce 2 or 3 with probablity .5
* generate(2) will produce 1 or 3 with probablity .5
* ... you get the idea.
*/
function generate(nb) {
rnd = Math.round(Math.random())
return 1 + (nb + rnd) % 3
}
如果要避免函数调用,可以内联代码。
这是一个解决您的问题的 jsFiddle:http: //jsfiddle.net/AsMWG/
我创建了一个包含 1,2,3 的数组,首先我选择任何数字并将其与最后一个元素交换。然后我只从位置 0 和 1 中挑选元素,并将它们与最后一个元素交换。
var x = 1; // or 2 or 3
// this generates a new x out of [1,2,3] which is != x
x = (Math.floor(2*Math.random())+x) % 3 + 1;
您可以使用 javascript 内置的随机数生成器随机生成数字。你需要使用Math.random()
.
如果你正在push()
进入一个数组,你总是可以检查之前插入的一个是否是相同的数字,因此你可以重新生成这个数字。这是一个例子:
var randomArr = [];
var count = 100;
var max = 3;
var min = 1;
while (randomArr.length < count) {
var r = Math.floor(Math.random() * (max - min) + min);
if (randomArr.length == 0) {
// start condition
randomArr.push(r);
} else if (randomArr[randomArr.length-1] !== r) {
// if the previous value is not the same
// then push that value into the array
randomArr.push(r);
}
}
代码已经过测试,它可以满足您的需求。
var RandomNumber = {
lastSelected: 0,
generate: function() {
var random = Math.floor(Math.random()*3)+1;
if(random == this.lastSelected) {
generateNumber();
}
else {
this.lastSelected = random;
return random;
}
}
}
RandomNumber.generate();
正如 Widor 评论的那样,生成这样一个数字相当于生成一个概率为 0.5 的数字。所以你可以尝试这样的事情(未经测试):
var x; /* your starting number: 1,2 or 3 */
var y = Math.round(Math.random()); /* generates 0 or 1 */
var i = 0;
var res = i+1;
while (i < y) {
res = i+1;
i++;
if (i+1 == x) i++;
}