【问题标题】:Java math.random won't randomize inside a function?Java math.random 不会在函数内随机化?
【发布时间】:2019-04-15 23:51:44
【问题描述】:

作为业务分析师开始创业,但我需要学习 Javascript 以完成工作中的其他一些任务:/ 我刚开始使用代码学院,所以我对 Javascript 的了解仍然非常有限。

无论如何,我试图在函数中产生一个随机数,但它产生的数字似乎总是相同的数字/结果。

var randNum = Math.floor(Math.random()*3)
function getChoice ()
{
  if (randNum) = 0) {console.log("Choice 1")}
  else if (randNum = 1) {console.log("Choice 2")}
  else (console.log("Choice 3")}
}
getComputerChoice()
console.log(randNum)

代码似乎总是选择选择 2。但是,当我 // 选择 2 时,它会选择选择 3。由于某种原因,它无法显示选择 1。我也尝试只使用 randNum 变量最后一个 console.log(randNum) 行来检查它是否真的随机化。可以,但仅当它不与函数一起使用时

var randNum = Math.floor(Math.random()*3)
function getChoice ()
{
  var choiceRandNum = Math.floor(Math.random()*3)
  if (choiceRandNum) = 0) {console.log("Choice 1")}
  else if (choiceRandNum = 1) {console.log("Choice 2")}
  else (console.log("Choice 3")}
}
getChoice()
console.log(randNum)

对于上面的代码,我尝试为函数创建一个不同的变量(但本质上是相同的 sa randNum)。现在最后一行可以显示不同的数字(0,1,2),但该函数仍然不会随机化。可以进行任何编辑吗?请不要使用过于复杂的解决方案,因为我仍然不太了解 java。

【问题讨论】:

  • 这看起来像 javascript 而不是 java。
  • 啊,对不起,javascript 是代码学院上说的
  • 另外,你在函数之外随机化,所以它只发生一次。就像that joke。你做了同样的事情——你只是没有掷骰子而是要求计算机这样做——但你仍然总是给出相同的预定“随机数”。将第一行放入函数中,以查看每次需要随机数时实际掷骰子的区别。
  • 嗨,阿马丹,我不确定我是否理解。所以我必须在函数的第一行包含 var randNum = Math.floor(Math.random()*3) ?我也这样做了,但它似乎仍然产生相同的预定选择 2。

标签: javascript performance function math random


【解决方案1】:

目前,您的代码中有多个错误。以下是如何以编程方式修复它们,从您的原始代码开始,到我认为您想要的结束:

1:您的代码中有很多语法错误。首先,这是一个干净的版本,因此更容易看到发生了什么:

var randNum = Math.floor(Math.random() * 3)
function getChoice() {
if (randNum) = 0) {
  console.log("Choice 1")
}
else if (randNum = 1) {
  console.log("Choice 2")
}
else (console.log("Choice 3")
}
}
getComputerChoice()
console.log(randNum)

然后,您可以删除所有多余的括号,并添加其他括号:

var randNum = Math.floor(Math.random() * 3)
function getChoice() {
    if (randNum = 0) {
        console.log("Choice 1")
    }
    else if (randNum = 1) {
        console.log("Choice 2")
    }
    else {
        console.log("Choice 3")
    }
}
getComputerChoice()
console.log(randNum)

最后,您可以在if 语句中添加等价运算符== 而不是赋值运算符=,并添加分号:

var randNum = Math.floor(Math.random() * 3);
function getChoice() {
    if (randNum == 0) {
        console.log("Choice 1");
    }
    else if (randNum == 1) {
        console.log("Choice 2");
    }
    else {
        console.log("Choice 3");
    }
}
getComputerChoice();
console.log(randNum);

2:您的函数名称与您调用的名称不同。将你的函数重命名为getComputerChoice()

var randNum = Math.floor(Math.random() * 3);
function getComputerChoice() {
    if (randNum == 0) {
        console.log("Choice 1");
    }
    else if (randNum == 1) {
        console.log("Choice 2");
    }
    else {
        console.log("Choice 3");
    }
}
getComputerChoice();
console.log(randNum);

3:你只声明了一次随机数,所以无论你调用多少次函数,它都不会改变。要解决此问题,请在函数外部将 randNum 声明为 0,然后在函数中进行更改:

var randNum = 0;
function getComputerChoice() {
    randNum = Math.floor(Math.random() * 3);
    if (randNum == 0) {
        console.log("Choice 1");
    }
    else if (randNum == 1) {
        console.log("Choice 2");
    }
    else {
        console.log("Choice 3");
    }
}
getComputerChoice();
console.log(randNum);

现在您的代码可以运行了。这是一个有效的 sn-p:

var randNum = 0;
function getComputerChoice() {
  randNum = Math.floor(Math.random() * 3);
  if (randNum == 0) {
    console.log("Choice 1");
  } else if (randNum == 1) {
    console.log("Choice 2");
  } else {
    console.log("Choice 3");
  }
  console.log(randNum);
}
<button onclick="getComputerChoice()">Random Number</button>

注意:我提供的 sn-p 将console.log(randNum) 放在函数内部,所以如果randNum == 1,输出将是:

Choice 2
1

【讨论】:

  • 谢谢!这使它更加清晰。还在函数之外设置 randNum = 0,下次遇到类似情况时请记住这一点!
【解决方案2】:

您在函数外部声明变量,因此无论您多久调用一次函数,结果都将保持不变。您的代码中还有一些语法错误。使用=== 代替= 并删除一些括号:

function getChoice () {
    var randNum = Math.floor(Math.random()*3);

    if (randNum === 0) {
        console.log("Choice 1");
    } else if (randNum === 1) {
        console.log("Choice 2");
    } else { 
        console.log("Choice 3");
    }
}

getChoice();

这应该会给你想要的结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2011-07-13
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多