我有一个数字在1-3之间的变量。
我需要在1-3之间随机生成一个新数字,但它不能与最后一个相同。
它发生在循环中数百次。
最有效的方法是什么?
答案 0 :(得分:5)
模块算术的力量可以帮助你!!
此函数使用模运算符执行您想要的操作:
/**
* 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
}
如果你想避免函数调用,你可以内联代码。
答案 1 :(得分:2)
这是一个解决问题的jsFiddle:http://jsfiddle.net/AsMWG/
我创建了一个包含1,2,3的数组,首先我选择任意数字并将其与最后一个元素交换。然后我只从位置0和1中选择元素,并将它们与最后一个元素交换。
答案 2 :(得分: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;
答案 3 :(得分:0)
您可以使用内置于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);
}
}
答案 4 :(得分:0)
代码经过测试,它可以满足您的需求。
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();
答案 5 :(得分:0)
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++;
}