为什么 Math.floor(Math.random()) 函数总是 return “0”?

Why does Math.floor(Math.random()) function always return "0"?

我正在编写一个程序,在 01 之间选择一个随机数,然后进入 while 循环,直到随机数生成器 select 的值大于 .5.每次我 运行 程序,程序 returns 0 并无限循环直到它崩溃。为什么会这样?不应该 Math.floor(Math.random()) 最终 select 比 .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());
}

有几个原因:

  • 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

这一行几乎总是 return 0,这就是它不进入 while 的原因。

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

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

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

同时在 Math.random 上使用 Math.floor 方法将始终 return 0,因为 Math.random 将 return 一个介于 0 和 1 之间的数字,这将使 floor到 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.

试试这个:(对不起,如果我在长咒语上有任何错误......有很多...)

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<2e7;i++) 或类似的东西是更好的做法,但我认为如果它只是用于命令行,那应该没问题。

您的 while 循环永远不会 运行。
Math.random() returns 数字 n 其中 0 <= n <1
Math.floor(n) returns n 向零四舍五入。

所以你的变量 randomNumber 将始终等于零。

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

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();
}