1

由于某种原因,以下代码不起作用。

var a1 = Math.floor(Math.random()*4+1); 

//Answer2
for(a2 = 0; a2 != a1 && a2 != 0; a2 = Math.floor(Math.random()*4+1)){
    alert(a2);
}

我试图让“a2”成为 1-4 的 int,但不等于“a1”。

怎么了?提前致谢!!!

编辑:

感谢大家的帮助!这是我的最终结果:

var a1, a2;
a1 = Math.floor(Math.random()*4+1); 
a2 = a1;

while(a2 == a1){
        a2 = Math.floor(Math.random() * 3 + 1);
        alert(a2);
}
4

6 回答 6

5

一个while循环怎么样?初始化a2 = a1然后:

while(a2 == a1) {
    a2 = Math.floor(Math.random() * 4 + 1);
}
于 2012-09-21T01:48:22.000 回答
4

你的测试逻辑是颠倒的。当测试为真时,for 循环继续执行,如果失败则不会。而不是:a2 != a1 && a2 != 0你应该有(a2 == a1) || (a2 == 0). 尽管还要记住,警报也只会在 a2 为无效状态的情况下执行,尽管 for 之后的警报应该是有效的。

或者,如果您正在寻找有趣的数学方式来使用模运算(无需重试):

a2 = (Math.floor(Math.random() * 3 + (a1 + 1)) % 4) || 4
于 2012-09-21T01:46:49.233 回答
2

试试这个功能。max它会给你一个从 1 到随机顺序的数组。然后你可以用它来给一个变量赋值,它永远不会重复:

编辑:我找到了一种纯粹的功能性方法:

function randomRange(min, max) {
  return (new Array(++max-min))
    .join('.').split('.')
    .map(function(v,i){ return min+i })
    .sort(function(){ return 0|Math.random()*max });
}

console.log(rand(1,4)); //-> [4,2,1,3] random array from 1 to 4

var arr = rand(1,4);
var a = arr[0];
var b = arr[1];
...

编辑2:似乎上面的某些浏览器存在问题,请查看随机但仅在Chrome中以获得更好的解决方案。

演示: http: //jsbin.com/ohohum/1/edit(运行多次查看随机性)

于 2012-09-21T02:31:22.060 回答
1

如果数字大于或等于您要排除的数字,只需添加一个:

var a2 = Math.floor(Math.random() * 3 + 1);

if(a2 >= a1) {
    a2++;
}
于 2012-09-21T01:39:19.357 回答
1

当不等于或为零,您正在选择一个新a2值。这是倒退的——你在循环之前设置为零,所以它永远不会执行。a2a1a2

您需要循环 whilea2为零或等于a1

var a1 = Math.floor(Math.random()*4+1); 

//Answer2
for(a2 = 0; a2 == a1 || a2 == 0; a2 = Math.floor(Math.random()*4+1)){
    // nothing here
}   
alert(a2);
于 2012-09-21T01:47:46.600 回答
0

有两种标准的方式来做这种事情。我正在考虑一个稍微更通用的框架

筛选列表中的示例

  1. 创建要从中选择的基值数组

    var values = [1,2,3,4]
    
  2. 删除您不感兴趣的值

    values = Array.filter( values, function(x) { return x!=a1; } )
    
  3. 从列表中随机选择一个值

    var a2 = values[Math.floor(Math.random()*values.length)];
    

使用拒绝抽样

  1. 创建要选择的值数组

     var values = [1,2,3,4]
    
  2. 随机选择一个值并重试直到成功

     var a2 =  values[Math.floor(Math.random()*values.length)];
     while( a2==a1 )
     {
       a2 = values[Math.floor(Math.random()*values.length)];
     }
    

比较

如果我们考虑n初始列表的长度和m移除的元素数量,则过滤后的版本会n进行比较以构建过滤后的列表长度n-m,但只会生成一个随机数。相比之下,拒绝方法进行平均n/(n-m)比较和随机数生成。

于 2012-09-21T07:39:41.990 回答