【问题标题】:get random item from javascript array repeatedly?反复从javascript数组中获取随机项?
【发布时间】:2020-05-13 04:43:35
【问题描述】:

我正在制作一个 Discord.js 机器人,该机器人的功能之一是在用户键入“!fact”时从 Javascript 事实数组中返回一个随机项。这个问题已经被其他用户问了很多,我使用了给他们的答案中的代码,但我遇到了一个问题:机器人“卡在”一个事实上,并且不会每次都随机遍历列表输入“!fact”。 这是我到目前为止的代码示例:

var facts = [ "Fact 1", "Fact 2", "Fact 3", "Fact 4" ]
var fact = Math.floor(Math.random() * facts.length);

然后,让机器人发送消息:

client.on('message', message => {
    if (message.content === "!fact") {
        message.channel.send(facts[fact]);
        console.log('Message sent');
    }
});

但这只会一遍又一遍地返回类似Fact 1 的东西,无论“!fact”被输入多少次。我怎样才能让它每次都改变?

【问题讨论】:

  • 将您的事实值放入 if 条件中,它会不断更新它
  • 浏览器速度测试说如果条件是相同的速度内部函数调用和赋值,并且node.js速度测试建议一个函数(var fact = ()=> Math.floor(Math.random() * fact.length);) 调用稍快

标签: javascript bots discord discord.js


【解决方案1】:

您在启动时使用此行仅确定一次随机事实:

var fact = Math.floor(Math.random() * facts.length);

要在每次 if 条件评估为真时获得一个随机事实,您需要为其中的事实重新分配一个新的随机整数:

    client.on('message', message => {
        if (message.content === "!fact") {
            fact = Math.floor(Math.random() * facts.length);
            message.channel.send(facts[fact]);
            console.log('Message sent');
        }

});

【讨论】:

    【解决方案2】:

    Math.random() 返回一个介于 0 和 1 之间的浮点值,因此将此数字乘以一个不需要的整数(几乎从不)返回一个整数,这实际上是您需要遍历一个数组。

    https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Math/random

    Math.random() 函数返回一个浮点伪随机数,范围为 0 到小于 1(包括 0,但不包括 1),并且在该范围内大致均匀分布 - 然后您可以对其进行缩放到您想要的范围。实现选择随机数生成算法的初始种子;用户不能选择或重置它。

    要解决这个问题,您通常可以使用 Math.round() 或 Math.floor。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

    Math.floor() 函数返回小于或等于给定数字的最大整数。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round

    Math.round() 函数返回四舍五入到最接近整数的数值。

    由于您需要限制您的 fact.length 范围,您可以使用 Math.floor,因为数组的索引从 0 开始,所以永远不会获得长度值,换句话说,最后一个事实的索引是相等的到 (facts.length - 1)。

    client.on('message', message => {
      if (message.content === "!fact") {
        const factIndex = Math.floor(Math.random() * facts.length);
        const fact = facts[factIndex]
        message.channel.send(fact);
        console.log('Message sent');
    }
    
    });

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 2017-02-01
      • 2018-06-19
      • 2022-10-08
      • 2014-07-30
      • 1970-01-01
      相关资源
      最近更新 更多