Math.random不断返回相同的答案
Math.random Keeps Returning the Same Answer
我对编码和javascript还很陌生,但我把下面的代码写成一个三向随机化器。一切似乎都工作正常,除了无论我运行代码多少次,返回的内容都是插入为"c"的内容。我想知道是否有人可以给我一些关于如何解决这个问题的快速建议。谢谢。
var random = function() {
var randomizer = function() {
Math.random() * 100
}
if (randomizer <= 33) {
var compDecision = "a"
}
else if (randomizer > 67) {
var compDecision = "b"
}
else if (33 < randomizer <= 67) {
var compDecision = "c"
}
document.write(compDecision)
}
堆事情马上浮现在脑海中:
1. JavaScript 没有隐式返回
所以这不会像你想象的那样:
var randomizer = function() {
Math.random() * 100
}
该函数返回undefined
.你需要:
var randomizer = function() {
return Math.random() * 100
}
2. 括号在 JavaScript 函数调用中不是可选的
所以这也不符合你的想法:
if (randomizer <= 33) {
var compDecision = "a"
}
您将需要:
if (randomizer() <= 33) {
var compDecision = "a"
}
3. JavaScript 没有三向比较
所以这不会像你想象的那样:
else if (33 < randomizer <= 67)
您将需要:
else if (33 < randomizer() && randomizer() <= 67)
最后,正如其他人所提到的,将randomizer
定义为一个函数实际上首先没有意义。为了让你的random
函数做你想做的事(以大致相等的概率产生'a'
、'b'
或'c'
),你真的想在函数的开头生成一个随机值并重用它:
function random() {
var randomizer = Math.random() * 100;
if (randomizer <= 33) {
return 'a';
} else if (randomizer <= 67) {
return 'b';
} else {
return 'c';
}
}
console.log(random());
希望这有所帮助。
Dan Tao 的回答很棒,此外,只调用一次的单行函数似乎没有任何意义,所以:
var n = Math.random() * 100;
但是,document.write 部分可能应该是独立的,因为您可能希望以不宜始终将结果写入当前文档的方式调用此函数。
最后,您只需要测试三个条件中的两个,因为如果它不是前两个条件中的任何一个,它必须是第三个。为此,您可以使用条件运算符:
function random() {
var n = Math.random() * 100;
return n <= 33? 'a' : n <= 67? 'c' : 'b';
}
document.write(random());
您没有正确调用 randomizer
函数。我已经删除了它,因为在这种情况下它并不是真正必要的:
var random = function() {
// I assume you want the comparisons below to be run against the same number
var randomNumber = Math.random() * 100;
if (randomNumber <= 33) {
var compDecision = "a";
}
else if (randomNumber > 67) {
var compDecision = "b"
}
else {
var compDecision = "c"
}
return compDecision;
}
您可以将代码简化为:
var randomizer = Math.random() * 100;
if (randomizer <= 33) {
var compDecision = "a";
} else if (randomizer > 67) {
var compDecision = "b";
} else if (33 < randomizer && randomizer <= 67) {
var compDecision = "c";
}
alert(compDecision);
随机发生器是一个保存函数的变量。
要了解此问题,请尝试
alert(Math.random());
var 值 = 随机发生器();警报(值);
我认为,你可以像这样做同样的事情:
function Randomize(){
rng = Math.random() * 3;
rng = Math.round(rng);
switch(rng) {
case 0:
return "a"
break;
case 3:
return "a"
break;
case 1:
return "b"
break;
case 2:
return "c"
break;
};
};
alert(Randomize());
JavaScript 要求在每个语句后加一个分号。但是,if/then/else 后面不应该跟一个分号。
if (a < 10) {
alert("Less than ten.");
} else {
alert("Ten or more.");
}
有时分号会自动插入到它们所属的位置,但您不应该依赖它 - 最好自己键入它们。
关键字 var
用于创建/声明/初始化变量。每个变量仅执行一次此操作。
此外,最好在包含它的函数顶部声明一个变量。
function() {
var result;
if (condition1 === true) {
result = "a";
} else if (condition2 === true) {
result = "b"
} else {
result = "c"
}
return result;
}
在你的代码中,"随机发生器"是一个函数。要执行它并获取它返回的值,您必须在它后面加上一对括号:randomizer()
所以randomizer <= 33
不是比较两个数字,而是比较一个函数和一个数字。randomizer > 67
也是如此.因此,它们中的每一个的评估结果都false
.
然后,33 < randomizer <= 67
计算结果为 true
.为什么?我不确定。但因为它被认为是"真实的",所以var compDecision = "c"
被处决了。
这就是为什么你不断得到"c"。
编辑:RobG下面的评论解释了为什么33 < randomizer <= 67
在JavaScript中评估为true
。
- 节点导出返回一个空对象
- ES6构造函数返回基类的实例
- 为什么不是't我的javascript向Project Euler返回正确答案's排名第一
- RegExp-如何返回单行答案而不是多行答案
- Math.random不断返回相同的答案
- 如何将答案返回到文本区域
- 如果语句返回错误答案
- 让 ajax 数据返回到调用函数 - 需要澄清之前的答案
- Javascript 的提示,它接受简单的数学作为值,然后返回答案
- Javascript.如何将问题和正确答案返回给 Math.random
- 如何显示返回确认的返回答案
- 我正在尝试制作一个基于遗传学的身高计算器.但是javascript没有;t返回预期答案
- 为什么我的函数if/else-if/else-if语句返回相同的答案
- 我如何引用并返回一个响应,基于一个单选按钮的答案,该单选按钮包含在另一个单选键中
- 为什么答案是.Id和response.name返回null
- 节点没有返回正确的答案
- getElementsByClassName 不返回固定答案
- 选择答案前返回对话框
- 使用javascript检查是否选择了单选按钮,并根据选择返回特定答案
- 公式返回的值略低于“正确”答案