【问题标题】:Struggling to get a random name generator to work努力让随机名称生成器工作
【发布时间】:2021-09-16 06:27:34
【问题描述】:

试图在下面生成一个由两部分组成的随机名称并推到一起,我需要帮助使它打印到屏幕上,以便它每次都会选择三个选项之一有时它选择无。我是 JavaScript 新手。

const randomName = {
   prefix: ['Bramble', 'Lion', 'Owl'],
   suffix: ['Paw', 'Throat', 'Tail']
};

let firstHalf = () => {
switch(Math.floor(Math.random() * 10)){
  case 0:
      console.log(randomName.prefix[0])
  break;
  case 1:
      console.log(randomName.prefix[1])
  break;
  case 2:
      console.log(randomName.prefix[2])
  break;
};
};

let secondHalf = () => {
switch(Math.floor(Math.random() * 10)){
    case 0:
        console.log(randomName.suffix[0])
    break;
    case 1:
        console.log(randomName.suffix[1])
    break;
    case 2:
        console.log(randomName.suffix[2])
    break;
  };
};


console.log(`Your warrior name is ${firstHalf()} ${secondHalf()}!`);

【问题讨论】:

  • 您的 switch case 返回一个介于 0 和 9 之间的数字。如果您需要介于最小值和最大值之间的数字,您应该检查:Random number between two numbers

标签: javascript random generator


【解决方案1】:

如果您使用返回最小值和最大值之间的数字的函数,您可以执行以下操作。检查 cmets 中提到的以下链接@Reyno 找到这样的函数:Generate random number between two numbers in JavaScript

正如 Cerbrus 以某种方式已经写的那样:

如果该函数仅返回您的名称数组中表示的数字,则您不需要开关盒。

const randomName = {
  prefix: ['Bramble', 'Lion', 'Owl'],
  suffix: ['Paw', 'Throat', 'Tail']
};

firstHalf = randomName.prefix[randomNumberBetween(0, 3)];
secondHalf = randomName.suffix[randomNumberBetween(0, 3)];

或者为了让它更可靠,请使用名称数组的长度,这样在添加新名称时不必总是更改最大值

const randomName = {
  prefix: ['Bramble', 'Lion', 'Owl'],
  suffix: ['Paw', 'Throat', 'Tail']
};

firstHalf = randomName.prefix[randomNumberBetween(0, randName.prefix.length)];
secondHalf = randomName.suffix[randomNumberBetween(0, randName.suffix.length)];

【讨论】:

    【解决方案2】:

    简单的方法是创建函数,该函数返回数组元素之一,没有任何 case 切换循环

    const randomName = {
       prefix: ['Bramble', 'Lion', 'Owl'],
       suffix: ['Paw', 'Throat', 'Tail']
    };
    function getRand(arr){
      return arr[Math.floor(Math.random()*arr.length)]
    }
    console.log(`Your warrior name is ${getRand(randomName.prefix)} ${getRand(randomName.suffix)}!`);

    【讨论】:

    • 您正在使用arr.length 定义可以选择的最大index,但最大索引比数组长度小1,因为第一个索引为0。使用Math.floor 将导致发生这种情况的可能性很小,但如果 Math.random 的输出为 1,它仍然可能发生。
    • Shyne 不正确。此处的Math.floor 方法将提供适当的均匀分布。
    • @Shyne 请阅读关于Math.random() 的文档,在这个例子中你从 0 到 2,这正是他所需要的
    • 我的错,我认为Math.random 会返回一个介于 0 和 1 之间的数字,但不包括 1。
    【解决方案3】:

    你做错了,不要使用 switch 语句并单独编码每个值,这是非常糟糕的做法。 现在,你的随机函数也是错误的,你想要一个 0 到 2 之间的整数并生成一个 0 到 10 之间的 FLOAT。 以下是生成随机数的方法:

    function random(min, max) {
        let delta = max - min;
        return min+Math.round(Math.random()*delta);
    }
    

    要在数组中获取随机值,您可以这样做:

    let firstHalf = randomName.prefix[random(0, randomName.prefix.length-1)];
    

    【讨论】:

    • Math.floor 非常好。事实上,您的Math.Round 可以产生比max 高1 的数字。
    • Math.round 不能产生大于最大值的数字 1。例如,最小值为 2,最大值为 5,随机值为最大值:delta = 5 - 2 = 3 |返回值 = 2 + 1*3 = 5 舍入 5 将始终得到 5。Math.floor 将阻止我们获得最大值,并且不同数字的概率不相等。
    • 不正确。 Math.round 方法实际上是一种提供uneven distribution
    • 检查您发送的链接后,我仍然可以告诉您math.floor 是不均匀的,因为如果您的范围为 [0, 100],0 被选中的机会将超过 100。如果你用Math.round他们被选中的机会是一样的。
    • 以这种情况为例:Math.random() * 10。如果滚动0.0,那么生成的0.0 将下降到0。如果滚动0.99,则生成的9.9 将下降到9。这是10 整数的完美包含 范围,从09。您对 floor 方法是从零开始的事实感到困惑。
    【解决方案4】:

    你的代码有几个问题:

    1. firstHalfsecondHalf 不要 return 任何东西。
    2. 您的Math.floor(Math.random() * 10) 产生介于09 之间的随机数,而您只有3 选项。将 10 替换为 3`。或者...使用数组的长度。
    3. 如果 switch 的条件是您使用的,则不需要switch 语句:
    switch(myNumber){
      case 0:
        doStuffWith[0];
      break;
      case 1:
        doStuffWith[1];
      break;
      case 2:
        doStuffWith[2];
      break;
    };
    

    可以替换为:

    doStuffWith[myNumber]
    

    所以,firstHalf 应该是这样的:

    let firstHalf = () => {
      const name = randomName.prefix[Math.floor(Math.random() * randomName.prefix.length)];
      console.log('firstHalf', name);
      return name;
    };
    

    【讨论】:

    • 我想你打算写doStuffWith[1]doStuffWith[2]
    【解决方案5】:

    Math.random() 随机选择 [0;1[ 如果你做 x10 你最终会得到这个范围 [0;10[ 但是您只有 3 个值(索引 0、1 和 2),因此当它选择 3 或更高时,您最终什么都没有选择。

    您需要找到一种方法来选择 [0,3[ 以确保您有一个与您的随机数相对应的值

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2019-04-24
      • 2012-01-15
      • 1970-01-01
      • 2013-01-19
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      相关资源
      最近更新 更多