Math.random不断返回相同的答案

Math.random Keeps Returning the Same Answer

本文关键字:答案 返回 random Math      更新时间:2023-09-26

我对编码和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