1到4之间的随机数,不是另一个随机数

时间:2012-09-21 01:36:47

标签: javascript math random for-loop

由于某种原因,以下代码无效。

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 个答案:

答案 0 :(得分:2)

尝试使用此功能。它会以随机顺序为您提供一个数字从1到max的数组。然后,您可以使用它为变量赋值,并且它永远不会重复:

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

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 :如上所述,某些浏览器存在问题,请查看Random but just in Chrome以获得更好的解决方案。

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

答案 1 :(得分:1)

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

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

if(a2 >= a1) {
    a2++;
}

答案 2 :(得分:1)

a2 a2相同或为零时,您选择新的a1值。这是向后的 - 你在循环之前将a2设置为零,因此它永远不会执行。

a2为零或等于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);

答案 3 :(得分: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)];
    
  4. 使用拒绝抽样

    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)];
       }
      
    3. 比较

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