【问题标题】:Why does Math.floor(Math.random()) function always return "0"?为什么 Math.floor(Math.random()) 函数总是返回“0”?
【发布时间】:2015-09-29 21:42:59
【问题描述】:

我正在编写一个程序,它在01 之间选择一个随机数,然后进入一个while 循环,直到随机数生成器选择一个大于.5 的值。每次我运行程序时,程序都会返回0 并无限循环直到崩溃。为什么会出现这种情况? Math.floor(Math.random())最终不应该选择比.5更高的数字吗?

var randomNumber = Math.floor(Math.random());
while(randomNumber < .5) {
var name = prompt("Do you want to play a game? Like checkers or something?");
if (name === "Yes") {
    console.log("Good jorb!");
} else if(name === "No.") {
    console.log("Go away!!!!!");
 else {
    console.log("I have no idea");
}

var randomNumber = Math.floor(Math.random());
}

【问题讨论】:

  • 我建议,如果您希望您的帖子被认真对待,请不要无缘无故地骂人。
  • 第二个var randomNumber = ...应该是randomNumber = ...
  • 我对您要实现的总体目标感到有些困惑。但是,我可以告诉你,while 循环永远不会按所写的那样运行。 Math.floor 将数字下降到最接近的整数。 Math.random 返回一个介于 0 和 1 之间的数字,不包括 1。这意味着 Math.floor(Math.random()) 将始终为 0,因此根据需要执行循环中的任何操作,它永远不会超过 0.5。
  • 如果你想测试不同的大小写组合,为什么不if (name.toUpperCase() === 'YES')?如果你想允许一个可选的句号,那么也许是一个不区分大小写的正则表达式:if (/^(yes|yup)\.?$/i.test(name)) - 那个单一的 if 测试将取代你的 all...
  • 我正在努力做到这一点,因此确认提示将随机循环,直到 math.random 在 0 到 1 @DLH 的范围内选择一个大于 0.5 的数字

标签: javascript if-statement random while-loop infinite-loop


【解决方案1】:

这一行几乎总是返回 0,这就是为什么它没有进入 while。

var randomNumber = Math.floor(Math.random());

Math.random() 从 0 开始返回小于 1 的浮点值 ...并且使用 Math.floor 你得到的 int 部分确实是 0

【讨论】:

  • 根据规范,Math.random 可以返回 0 但从不返回 1。
【解决方案2】:

您的变量 randomNumber 已经用您的第一行初始化,要更改它的值,只需使用 randomNumber = newValue 其中newValue 是您希望将其设置为的值,使用方法或硬编码值。您无需再次使用var 关键字。

同样在Math.random 上使用Math.floor 方法将始终返回 0,因为 Math.random 将返回一个介于 0 和 1 之间的数字,该数字将降至 0。

您的 while 循环中缺少右括号。

我清理了一些代码以链接您的 if 布尔运算符,尽管有更好的方法来构造此代码。

var randomNumber = Math(Math.random());
while(randomNumber > .5) {
    var name = prompt("Do you want to play a game? Like checkers or something?");
    if (name === "Yes" || name === "yes" || name === "Yes." || name === "yes." || name === "Yup" || name === "Yup." || name ===  "yup." || name === "yup")
    {
        console.log("Good jorb!");
    }

    else if(name === "No." || name === "No" || name === "no" || name === "no." || name === "nope" || name === "nope." || name ===  "Nope" || name === "Nope.")
    {
        console.log("That's too bad.");
    }
    else 
    {
        console.log("I don't know, man. I don't know");
    }
    randomNumber = Math(Math.random());
};// Close your while loop.

【讨论】:

  • 你是对的!我修复了它,在写这篇文章时在别处用 C# 代码编写,我很抱歉并感谢你抓住它。如上所述,还有很多更好的方法(正则表达式/数组等),只是用它来保持原始海报更容易理解的格式。
  • 对,是的,你根本不需要为自己辩护,尤其是在你立即纠正之后。我会删除我之前的评论。
【解决方案3】:

有几个原因:

  • 'Math.floor(Math.random())',将始终为零,因此循环永远不会开始。 Math.random() 将给出一个介于 0 和 1 之间的数字,并且您正在地板上,这意味着您总是向下舍入,这意味着零。
  • 如果你想停止while,最好'break;'当条件合适时。

此代码将起作用:

var randomNumber = Math.random();
while(randomNumber > .5) {
var name = prompt("Do you want to play a game? Like checkers or something?");
if (name === "Yes") {
    console.log("Good jorb!"); break;
} else if(name === "Nope.") {
    console.log("Okay that is fine.");
} else {
console.log("I don't know, man. I don't know");
}
randomNumber = Math.random(); }

但现在它不仅取决于循环是否会继续的答案,还取决于 randomNumber!

【讨论】:

    【解决方案4】:

    你的 while 循环永远不会运行。
    Math.random() 返回一个数字 n 其中 0 Math.floor(n) 返回 n 向零舍入。

    因此您的变量 randomNumber 将始终为零。

    您还可以将 if 语句替换为要检查的值数组。
    然后在该数组中查找名称的索引。
    如果索引为 -1,则不存在,否则记录“Good Jorb!”

    var randomNumber = Math.random();  
    while(randomNumber > .5) {
      var name = prompt("Do you want to play a game? Like checkers or something?");
      var yesArray = ["Yes", "yes", "Yes.", "yes.", "Yup", "Yup.", "yup.", "yup"];
      if(yesArray.indexOf(name) == -1) {
        console.log("I don't know, man. I don't know");
      else {
        console.log("Good jorb!");
      } 
      randomNumber = Math.random();
    }
    

    【讨论】:

      【解决方案5】:

      试试这个:(对不起,如果我在长长的脏话上记错了……有很多……)

      while(true){
          var name=prompt("Do you want to play a game? Like checkers or something?");
          if(name.search(/^[yY](es|up)\.?$/)!=-1){
              console.log('Good jorb!');
          }else if(name.search(/^[nN]o(pe)?\.?$/)!=-1){
              console.log('F'+'U'.repeat(12)+'C'.repeat(13)+'K'.repeat(9)+' Y'+'O'.repeat(11)+'U'.repeat(18)+'!'.repeat(12));
          }else{
              console.log("I don't know, man. I don't know");
          }
          if(condition){
              break;
          }
      }
      

      只是为了澄清一下正则表达式:它们本质上是寻找单词的不同形式,大写或没有,标点符号或没有表示完整的单词(^ 是字符串的开头,$ 是字符串的结尾) .这应该会为您省去很多麻烦。

      哦,在真正的开发实践中尽量避免使用while(true)for(var i=0;i&lt;2e7;i++) 或类似的东西是更好的做法,但我认为如果它只是用于命令行,那应该没问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-24
        • 2019-06-26
        • 2016-09-16
        • 2020-05-25
        • 2013-02-26
        • 2013-06-25
        相关资源
        最近更新 更多