我正在制作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
之类的内容。如何每次更改它?
您仅在启动时使用此行确定一次随机事实:
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');
}
});
[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');
}
});