Javascript 介于1和4之间的随机数,表示';这不是另一个随机数

Javascript 介于1和4之间的随机数,表示';这不是另一个随机数,javascript,math,random,for-loop,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之间的整数,但不等于“a1” 怎么了? 提前感谢 编辑: 谢谢大家的帮助! 以下是我的最终结果: var a1, a2; a1 = Math.f

由于某些原因,下面的代码不起作用

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之间的整数,但不等于“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);
}

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

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

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

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

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

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

你的测试逻辑颠倒了。For循环在测试为真时继续执行,而不是在测试失败时继续执行。而不是:
a2!=a1和a2!=0
您应该有
(a2==a1)| |(a2==0)
。尽管也请记住,警报也仅在a2为无效状态的情况下执行,但for后面的警报应有效

或者,如果您正在寻找有趣的math-y方法来使用模运算(无需重试):


你的测试逻辑颠倒了。For循环在测试为真时继续执行,而不是在测试失败时继续执行。而不是:
a2!=a1和a2!=0
您应该有
(a2==a1)| |(a2==0)
。尽管也请记住,警报也仅在a2为无效状态的情况下执行,但for后面的警报应有效

或者,如果您正在寻找有趣的math-y方法来使用模运算(无需重试):


a2
a1
相同或为零时,您正在选择一个新的
a2
值。这是向后的-在循环之前将
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);

a2
a1
相同或为零时,您正在选择一个新的
a2
值。这是向后的-在循环之前将
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);

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

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

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

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

尝试使用此函数。它将为您提供一个随机顺序从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:似乎上述内容在某些浏览器中存在问题,请查看更好的解决方案


演示:(多次运行以查看随机性)

尝试使用此功能。它将为您提供一个随机顺序从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:似乎上述内容在某些浏览器中存在问题,请查看更好的解决方案


演示:(运行多次以查看随机性)

有两种标准的方法来完成这类操作。不过,我正在考虑一个更一般的框架

从筛选列表中选择示例
  • 创建要从中选择的基值数组

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

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

    var a2 = values[Math.floor(Math.random()*values.length)];
    
  • 使用拒绝抽样
  • 创建要选择的值数组

     var values = [1,2,3,4]
    
  • 随机选择一个值,然后重试,直到成功为止

     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)
    比较和随机数生成

    做这类事情有两种标准方法。不过,我正在考虑一个更一般的框架

    从筛选列表中选择示例
  • 创建要从中选择的基值数组

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

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

    var a2 = values[Math.floor(Math.random()*values.length)];
    
  • 使用拒绝抽样
  • 创建要选择的值数组

     var values = [1,2,3,4]
    
  • 随机选择一个值,然后重试,直到成功为止

     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)
    比较和随机数生成

    好的,但如果它是假的,我需要它再试一次。对不起,我忘了提那件事。@Slulego:你说“如果是假的”是什么意思?还有,为什么要投否决票?这比循环更有效。我不是下选者,但我现在还不清楚代码的作用,以及它是否会扭曲a2的分布(想想贝叶斯定律)@wim:它不会扭曲任何东西。这是如何不扭曲的事情:)好,但如果它是假的,我需要它再试一次。对不起,我忘了提那件事。@Slulego:你说“如果是假的”是什么意思?还有,为什么要投否决票?这比循环更有效。我不是下选者,但我现在还不清楚代码的作用,以及它是否会扭曲a2的分布(想想贝叶斯定律)@wim:它不会扭曲任何东西。这是如何不扭曲的东西:)在现有的代码中,0检查是必要的,它是a2的初始化值。使用for结构,a2可以/应该使用对random的相同调用进行初始化,以防止第一次通过循环成为保证故障