【问题标题】:How to handle math.random when there are multiple arrays?有多个数组时如何处理 math.random?
【发布时间】:2020-06-06 07:53:12
【问题描述】:

我有四个数组 - 花、树、小动物和歌曲。

我有四个对应的函数——flower()、tree()、critter() 和 song()。

在上面的每个单独的函数中,我调用了我的 math.random 函数来从特定数组中检索一个随机单词。例如,在我的flower() 函数中,我有:

answer = flowers[Math.floor(Math.random() * flowers.length)];

我发现为了生成随机词,我还需要全局运行我的 math.random 函数。这是我的问题。我不知道在不分配变量的情况下创建 math.random 函数的方法。所以在全球范围内我有这个:

function randomWord() {
  answer = songs[Math.floor(Math.random() * songs.length)];
}

所以有时当我在花卉类别中时,我的花卉数组中的一个词会出现 - 但有时会出现一首歌曲,因为我必须将它发布到全球才能让它发挥作用。

我不知道如何修复它,虽然关于数组的 math.floor 函数有很多问题 - 我没有找到任何关于如何处理这样的多个数组的信息。

我想知道对于全局调用的 math.floor 函数,是否可以使用通用词来代替特定的变量词?或者也许是一个 if-else 语句?我被困住了,不胜感激。谢谢。

编辑添加:

@KevinWallis 这是直接从我的代码中粘贴的:

let answer = "";


function randomWord() {
  answer = songs[Math.floor(Math.random() * songs.length)];
}


function flower() {
  document.getElementById("main").style.display = 'none';
  document.getElementById("play").style.display = "block";
  answer = flowers[Math.floor(Math.random() * flowers.length)];
  word = flowers[answer];
  document.getElementById("categoryName").innerHTML = "Types of Flowers";
  updateTreePicture();
  randomWord();
  generateButtons();
  guessedWord();
}

更新:我只是想发布修复结果:

function randomWord() {
  if (categoryName === 'Flowers') {
    answer = flowers[Math.floor(Math.random() * flowers.length)];
  } else if (categoryName === 'Trees') {
    answer = trees[Math.floor(Math.random() * trees.length)];
  } else if (categoryName === 'Critters') {
    answer = critters[Math.floor(Math.random() * critters.length)];
  } else if (categoryName === 'Songs') {
    answer = songs[Math.floor(Math.random() * songs.length)];
  }
}

【问题讨论】:

  • 你能显示你调用randomWord()函数的代码吗?
  • 我不确定我是否理解您的问题,但return 的概念可能会对您有所帮助。
  • 根据什么条件选择随机列表?
  • 你在哪里调用flower函数?

标签: arrays math random floor


【解决方案1】:

您可以为歌曲、鲜花等创建多个random 函数。下面是调用此类随机函数并使用返回值的示例。

function randomSong() {
    songs = ...;
    return songs[Math.floor(Math.random() * songs.length)];
}

function randomFlower() {
    flowers = ...;
    return flowers[Math.floor(Math.random() * flowers.length)];
}

...

function flower() {
    document.getElementById("main").style.display = 'none';
    document.getElementById("play").style.display = "block";
    // use the selected flower instead of the global answer for all
    flower = randomFlower();
    document.getElementById("categoryName").innerHTML = "Types of Flowers";
    // e.g. the flower can be used as parameter
    updateTreePicture(flower);
    generateButtons();
    guessedWord();
}

【讨论】:

  • 谢谢。虽然这确实有效 - 它会在代码中需要 randomWord() 的其他地方产生一些问题。例如 - 重试按钮(页面刷新)。然后,我必须为每个类别分配一个唯一的刷新按钮。在这种情况下我可以这样做 - 但对于具有更多数组选项的项目来说,这似乎很麻烦。我很欣赏这个答案,并将继续寻找一种解决方案,当它们普遍需要相同的操作时,不需要为每个类别单独分配代码 - 我相信它存在!再次感谢!
【解决方案2】:

我认为这里有几件主要的事情将有助于您理解这里,并且可能会阻止您专注于将所有内容存储在单个全局变量中作为在任何地方访问数据的方法:

  1. 您可以从函数返回值以在调用该函数的位置使用。

function getTheNumberOne(){
  return 1;
}

var theNumberOne = getTheNumberOne();
console.log(theNumberOne);
  1. 如果您希望能够在函数中使用值,可以将值传递给函数。

function getNumberPlusTen(number){
  return number + 10;
}

var numberPlusTen = getNumberPlusTen(5);
console.log(numberPlusTen);
  1. randojs.com 提供了一个非常轻量级的库,它可以使随机性更简单、更易读。它会减少你的代码的很多复杂性,让你专注于重要的事情。要使用它,您只需将<script src="https://randojs.com/1.0.0.js"></script> 粘贴到您的 html 文档的 head 标记中,然后您就可以像这样简单易读地处理随机性:

var flowers = ["rose", "sunflower", "tulip"];
var randomFlower = rando(flowers).value;

console.log(randomFlower);
<script src="https://randojs.com/1.0.0.js"></script>
  1. 如果您必须将值存储在全局变量中,避免将它们全部混合在一起的简单方法是将它们存储在单独的变量中。您可以拥有多个全局变量!

var flowers = ["rose", "sunflower", "tulip"];
var trees = ["birch", "oak", "maple"];

var randomFlower = "";
var randomTree = "";

function assignRandomValues(){
  randomFlower = rando(flowers).value;
  randomTree = rando(trees).value;
}

function logValues(){
  console.log(randomFlower);
  console.log(randomTree);
}

assignRandomValues();
logValues();
<script src="https://randojs.com/1.0.0.js"></script>

我不能给你任何其他建议,因为我没有看过你的其余代码,但这些概念会很好地指导你。

【讨论】:

  • 非常感谢 - 我感谢所有这些重要信息!
  • 没问题!乐于助人。
  • @jenkruk 那么这两个答案中的哪一个有助于解决您的问题?
  • @RokoC.Buljan - 请参阅我帖子的最后一部分,我在其中更新了解决方案(if...else 声明)。谢谢。
猜你喜欢
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2014-09-27
相关资源
最近更新 更多