3

我有一个数字在 1-3 之间的变量。

我需要在 1-3 之间随机生成一个新数字,但它不能与最后一个相同。

它循环发生数百次。

这样做最有效的方法是什么?

4

6 回答 6

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
}

如果要避免函数调用,可以内联代码。

于 2012-04-17T10:37:23.647 回答
2

这是一个解决您的问题的 jsFiddle:http: //jsfiddle.net/AsMWG/

我创建了一个包含 1,2,3 的数组,首先我选择任何数字并将其与最后一个元素交换。然后我只从位置 0 和 1 中挑选元素,并将它们与最后一个元素交换。

于 2012-04-17T10:32:50.910 回答
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;
于 2012-04-17T10:39:38.090 回答
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);
    }
}
于 2012-04-17T10:28:27.923 回答
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();
于 2012-04-17T10:32:38.580 回答
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++;
}
于 2012-04-17T10:36:45.483 回答