Независимо от того, имитируете ли вы бросок кости или извлекаете какой-либо индекс из массива, компьютеры могут использоваться для генерации случайных чисел. В JavaScript случайные числа требуют комбинации Math функций, которые могут быть немного сложными для понимания в первый раз.

Допустим, вы хотите создать цифровую шестигранную кость, которая при щелчке выдаст вам случайное число от одного до шести. Наша функция для генерации этого случайного числа будет выглядеть так:

randomNumber = (sides) => Math.floor(Math.random() * sides) + 1;
randomNumber(6);

Примечание. Я использую стрелочную нотацию ES6. Нажмите здесь для объяснения функций стрелок.

Каждый раз, когда мы вызываем функцию, она будет возвращать любое число от одного до шести включительно. Но почему? Чтобы ответить на этот вопрос, нам нужно больше узнать о двух вызываемых нами функциях Math.

Math.random() — это функция, которая генерирует целое число (число с десятичным знаком) от нуля до единицы, включая ноль, но исключая единицу. Выход Math.random() может быть 0, 0,1, 0,2, 0,3343424587866554652345 или 0,99. Возможно все от нуля до почти единицы.

Math.floor() — это функция, которая округляет целое число до ближайшего целого числа. Округляя в меньшую сторону, 0,1 становится 0, 3,6 становится 3, а 5,4 становится 5. Думайте об этом как о округлении до нуля. (Примечание: есть также функция Math.ceil() для округления).

Объединив эти две функции, мы можем сгенерировать случайное число для нашего игрального кубика. Начнем с внутренней части нашей функции и будем работать снаружи:

  1. Math.random() генерирует случайное число от нуля до почти единицы, например,: 0.16
  2. Затем мы умножаем это число на количество сторон: 0.16 * 6 = 0.96
  3. Мы округляем этот продукт в меньшую сторону на Math.floor(): 0.96 -> 0
  4. Наконец, мы добавляем единицу, чтобы получить окончательное случайное число: 0 + 1 = 1

Результатом нашей функции randomNumber() является 1!

Вы можете спросить себя: «Зачем нам нужно было добавить единицу к нашему номеру?» Если да, то это очень хороший вопрос. Причина в том, что только Math.floor(Math.random() * 6) будет генерировать случайное число от 0 до 5. Это шесть вариантов, но никто не бросает кубик от нуля до пяти, поэтому мы добавляем единицу к результату, чтобы это имело смысл для нашей ситуации.

Наша функция допускает различное количество сторон, поэтому вам нужно будет передать другой аргумент только в том случае, если вы бросаете другой кубик.

Если все еще немного неясно, не беспокойтесь; Я включил несколько дополнительных примеров внизу этого поста. Попробуйте посчитать сами и убедитесь.

Удачного кодирования!

Дополнительные примеры генератора случайных чисел:

1. Math.random()    // 0.4
2. Multiply by 6    // 2.4
3. Math.floor()     // 2
4. Add one          // 3
Random number: 3
1. Math.random()    // 0.9
2. Multiply by 6    // 5.4
3. Math.floor()     // 5
4. Add one          // 6
Random number: 6
1. Math.random()    // 0.24
2. Multiply by 6    // 1.44
3. Math.floor()     // 1
4. Add one          // 2
Random number: 2
1. Math.random()    // 0.642
2. Multiply by 6    // 3.8520000000000003
3. Math.floor()     // 3
4. Add one          // 4
Random number: 4
1. Math.random()    // 0.82
2. Multiply by 6    // 4.92
3. Math.floor()     // 4
4. Add one          // 5
Random number: 5