反复从javascript数组中获取随机项目?

问题描述 投票:1回答:2

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

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”多少次,这只会反复返回Fact 1之类的内容。如何每次更改它?

javascript bots discord discord.js
2个回答
3
投票

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

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');
        }

});

1
投票

[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()函数返回舍入到最接近整数的数字的值。

由于您需要限制facts.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');
}

});
© www.soinside.com 2019 - 2024. All rights reserved.