получить случайный элемент из массива javascript повторно? - PullRequest
1 голос
/ 27 января 2020

Я создаю Discord. js бот, и одна из функций бота - возвращать случайный элемент из массива Javascript фактов, когда пользователь вводит "! Fact". Этот вопрос часто задавался другими пользователями, и я использовал код из ответов на них, но столкнулся с одной проблемой: бот застревает на одном факте и не go случайно попадает в список каждый раз набирается "! 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». Как я могу изменить это каждый раз?

Ответы [ 2 ]

4 голосов
/ 27 января 2020

Вы определяете свой случайный факт только один раз при запуске, используя эту строку:

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 голосов
/ 27 января 2020

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 () возвращает значение числа, округленное до ближайшего целого числа.

Так как вам нужно ограничить свой диапазон фактами. может использовать 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');
}

});
...