【问题标题】:Javascript: Using Math.random in functions nested in arraysJavascript:在嵌套在数组中的函数中使用 Math.random
【发布时间】:2018-11-06 03:15:46
【问题描述】:

我正在尝试编写一个应用程序,该应用程序将提供来自多个随机选择的组合结果。我正在使用二维数组。每个辅助数组的第一个元素是要“滚动”小于的数字,以返回辅助数组,其中包含一个字符串作为其第二个元素。

此外,字符串内部通常是另一个调用另一个数组的函数。

所有返回的字符串都连接成一个随机短语。

我的期望是每次调用每个函数都会给出一个新的随机结果。但是似乎正在发生的是,一旦第一个函数调用返回结果,所有嵌套函数调用每次都返回相同的结果。我希望每个嵌套函数调用每次都返回一个新的随机结果。

我希望我解释得足够好。这是我使用一些“示例”数组的一些代码,以试图弄清楚我在做什么。

// ROLL()
// times = NUMBER OF TIMES TO ROLL
// high = SIZE OF THE DIE / HIGHEST VALUE TO ROLL
// low = LOWEST VALUE (OPTIONAL)
// modifier = MODIFIER TO ROLL (OPTIONAL)

function roll(times, high, low, modifier) {
  low = low || 1;
  modifier = modifier || 0;
  var result = 0;

  for (var i = 0; i < times; i++) {
    result += (Math.floor(Math.random() * ((high - low) + 1) + low));
  }
  result += modifier;

  return result;
}

// RANDOMRESULT()
// array = A 2 DIM ARRAY
// modifier = MODIFIER TO ROLL (FOR THE ROLL() FUNCTION)
// dieSize = SIZE OF THE DIE (FOR THE ROLL() FUNCTION)

function randomResult(array, modifier, dieSize) {
  var die = dieSize || array[array.length - 1][0];
  var finalRoll = roll(1, die, 1, modifier);

  for (i = 0; i <= array.length - 1; i++) {
    if (finalRoll <= array[i][0]) {
      return array[i];
    }
  }
}

//ASSUME MULTIPLE ARRAYS SET UP SIMILARLY
var array1 = [
  [3, "You find " + roll(1, 10) + " dollars."],
  [5, "You find " + roll(1, 20) + " dollars."],
  [9, "You find " + roll(1, 30) + " dollars."]
];

var array2 = [...]

var someArray = [
  [2, "Random result from array1. " + randomResult(array1)],
  [4, "Random result from array2. " + randomResult(array2)],
  [10, "Random result from array3. " + randomResult(array3)]
];

console.log(randomResult(someArray));
console.log(randomResult(someArray));

编辑:每次页面刷新的结果总是随机的,但是当 randomResult() 被多次调用时,嵌套数组函数会出现相同的结果。 多个 console.log 返回的示例...

(2) [2, "Random result from array1. 9,You find 1 dollars."]
(2) [10, "Random result from array3. 9,You find 2 dollars."]
(2) [10, "Random result from array3. 9,You find 2 dollars."]
(2) [2, "Random result from array1. 9,You find 1 dollars."]
(2) [10, "Random result from array3. 9,You find 2 dollars."]
(2) [4, "Random result from array2. 9,You find 2 dollars."]

因此,每次滚动 '2' 或更少时,array1 中的 roll() 函数总是返回相同的值。与其他结果和其他数组相同。

所以我的问题是首先,为什么会发生这种情况?可能是因为第二个函数调用时第一个函数调用还没有完成?
其次,有什么建议可以解决这个问题。也许使用对象方法而不是 2 个暗淡数组?

感谢任何评论或帮助。谢谢。

【问题讨论】:

  • 我检查了你的array1,它确实有随机滚动结果。所以我不确定你的问题是什么。 :|

标签: javascript arrays


【解决方案1】:

当你多次调用randomResult()时,它会返回array1,并且array1的值在脚本加载时已经计算好了。 如果你每次都想要不同的值,把它放在一个函数中,然后调用函数来获取值。

function getRandomArray() {
    return  [
    [3, "You find " + roll(1, 10) + " dollars."],
    [5, "You find " + roll(1, 20) + " dollars."],
    [9, "You find " + roll(1, 30) + " dollars."]
    ];
}
console.log(getRandomArray());
console.log(getRandomArray());

【讨论】:

  • 啊!谢谢。我知道我应该休息一下。不知道为什么没有点击我。感谢您花时间回答。
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 2015-03-18
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多