【问题标题】:Iterating random number within For loop在 For 循环中迭代随机数
【发布时间】:2020-08-05 00:06:05
【问题描述】:

我正在尝试使用 For 循环将随机整数(从 0-2)添加到变量指定次数。我遇到的问题是循环在每次循环时都没有使用新的随机数,所以如果我传入 9,我只会得到 0、9 或 18。

我期望一个对象返回具有不同数值的键“a”和“b”。

这是我的随机数获取器:

function randomNumber(min, max){
   min = Math.ceil(0);
   max = Math.floor(3);
   return Math.floor(Math.random() * (max - min)) + min;
}

这是我调用 randomNumber() 的函数:

function objMaker(cb, num){
  let obj = {
    a: 0,
    b: 0
  }
  for (var i = 0; i < num; i++) {
    obj.a += cb;
    obj.b += cb;
  }
  return obj;
}

objMaker(randomNumber(), 9)
// returns obj { a:0, b:0}
// or obj { a:9, b:9}
// or obj { a:18, b:18}

我是一个初学者,所以我很感激你的帮助,因为我无法找到任何关于此事的信息。提前致谢。

【问题讨论】:

    标签: javascript for-loop random callback


    【解决方案1】:

    如果我理解正确,您希望在for 循环的每次迭代 中生成一个新的随机数。如果是这种情况,那么您也需要在每次迭代时调用您的 randomNumber()

    function randomNumber() {
       const min = Math.ceil(0);
       const max = Math.floor(3);
       return Math.floor(Math.random() * (max - min)) + min;
    }
    
    function objMaker(num){
      let obj = {
        a: 0,
        b: 0
      }
      for (var i = 0; i < num; i++) {
        obj.a += randomNumber();
        obj.b += randomNumber();
      }
      return obj;
    }
    
    function test() {
      console.log(objMaker(9));
    }
    &lt;button id=generate onclick='test()'&gt;generate&lt;/button&gt;

    如果你写objMaker(randomNumber(), 9),那么它会生成0、1或2一次,然后将它作为cb传递给objMaker。所以在for 循环中,它总是将相同的数字相加 9 次。

    【讨论】:

    • 感谢您的回复。现在完全有道理了。
    【解决方案2】:

    所以你所做的是:你将randomNumber()结果传递给objMaker 函数的第一个参数。这里我强调“结果”,因为这意味着您在randomNumber 函数中的cb 参数是一个数字,这意味着它在您的函数内部不会改变。

    function randomNumber(min, max){
       min = Math.ceil(0);
       max = Math.floor(3);
       return Math.floor(Math.random() * (max - min)) + min;
    }
    
    function objMaker(cb, num){
      console.log(cb); // notice that this is a number
      let obj = {
        a: 0,
        b: 0
      }
      for (var i = 0; i < num; i++) {
    
        // cb is both same since a number was passed (not a function)
        obj.a += cb; 
        obj.b += cb; // both cb here are identical, so a and b is the same at the end
      }
      return obj;
    }
    
    console.log(objMaker(randomNumber(), 9)) // randomNumber() here returns a random value

    说实话,我个人不明白为什么你必须将randomNumber函数传递给objMaker,但假设你需要,我认为这里最好的方法是传递randomNumber 函数,而不是randomNumber() 的结果。

    function randomNumber(min, max){
       min = Math.ceil(0);
       max = Math.floor(3);
       return Math.floor(Math.random() * (max - min)) + min;
    }
    
    function objMaker(cb, num){
      let obj = {
        a: 0,
        b: 0
      }
      for (var i = 0; i < num; i++) {
        obj.a += cb();
        obj.b += cb();
      }
      return obj;
    }
    
    console.log(objMaker(randomNumber, 9))

    或者根据您的使用情况,您可以为 a 和 b 设置不同但不变的 cb 术语。

    function randomNumber(min, max){
       min = Math.ceil(0);
       max = Math.floor(3);
       return Math.floor(Math.random() * (max - min)) + min;
    }
    
    function objMaker(cb, cb2, num){
      let obj = {
        a: 0,
        b: 0
      }
      for (var i = 0; i < num; i++) {
        obj.a += cb;
        obj.b += cb2;
      }
      return obj;
    }
    
    console.log(objMaker(randomNumber(), randomNumber(), 9))

    【讨论】:

    • 哇,这很有意义,我一定是太狭隘了,才会错过这一点。我很欣赏多种解决方案。是的,我正在尝试理解回调函数的效果,所以为了学习,我确实需要一个单独的 randomNumber() 函数。
    • 没问题。享受:)
    【解决方案3】:

    如果您使用 0 或 1 作为最小值,则无需指定(仅指定最大值就足够了)。假设最大值为 2,则以下函数将起作用

    function randomNumber(max){
       return Math.round(Math.random() * max);
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2021-12-27
      • 1970-01-01
      • 2021-05-03
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多