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的相同调用进行初始化,以防止第一次通过循环成为保证故障