JPais Ответов: 3

Как сгенерировать 5 случайных чисел от 1 до 20 в javascript


Всем Привет

Я работаю над кодом, в котором мне нужно сгенерировать 5 чисел из заданного диапазона (здесь от 1 до 20).

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

Заранее спасибо.

Что я уже пробовал:

<script type="text/javascript">
    $(document).ready(function () {
        $('#div').html(Math.floor(Math.random() * 6) + 1);

        var arr = [];
        for (var i = 0; i < 5; i++)
        {
            arr.push(Math.floor(Math.random() * 6) + 1)
        }
        console.log(arr);
    });
</script>

F-ES Sitecore

- это правильный путь?

если вы хотите 5 случайных чисел, то да

> иногда я получаю одни и те же числа в последних 5 числах.

А почему бы и нет? Это генератор случайных чисел, а не уникальный генератор случайных чисел, и в вашем коде нет ничего, что гарантировало бы уникальность чисел. Если вас интересуют только уникальные числа, то вам понадобится способ игнорировать уже выбранные случайные числа или ограничить пул возможных случайных чисел, чтобы каждый раз получать уникальное число. Как бы то ни было, если вы загуглите "javascript get unique random numbers", я уверен, что вы найдете образец кода.

Kornfeld Eliyahu Peter

За исключением границ [1,20] он выглядит хорошо...
Просмотрите это: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random

Sinisa Hajnal

Вы не генерируете 1-20. В остальном код выглядит нормально. Если вам нужны уникальные числа, вам нужен массив для проверки уже выбранных чисел и нужно изменить цикл с фиксированного числа на while.

3 Ответов

Рейтинг:
2

Yuriy Loginov

Попробуйте это, вы можете увидеть JS скрипку здесь: Edit fiddle - JSFiddle[^]

var arr = [];
for (var i = 0; i < 5; i++)
{
  arr.push(Math.floor(Math.random() * 20) + 1)
}

var str = "";
for (var i = 0; i < 5; i++)
{
  str += "," + arr[i];
}

var div = document.getElementById("test");
div.innerText = str;


Рейтинг:
1

CPallini

Следующий код извлекает пять чисел в поле 1..20 диапазон, без повторений.

var a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var n;
var r=[];
for (n=1; n<=5; ++n)
{
  var i = Math.floor((Math.random() * (20-n)) + 1);
  r.push(a[i]);
  a[i] = a[20-n];
}
Вы можете попробовать это сделать здесь[^].

Алгоритм описан здесь: Случайное извлечение 5 карт из колоды[^].


Ali Al Omairi(Abu AlHassan)

Идея этого решения состоит в том, чтобы сортировать исходный массив на 1 каждый раз, когда мы выбираем элемент, поэтому пространство выборки будет искажать время evry на 1, чтобы мы могли добавить оператор a.length = 20-n; после присвоения пустого слота a[i] последнему smple в пространстве.
Единственная ошибка в коде abve будет заключаться в операторе генерации случайного числа, потому что результатом будет случайное число от 1 до 20, но индекс ирригинального массива может быть от 0 до 19, так что мы можем исправить это, отредактировав оператор i = Math.floor(Math.rand() * (20 - n));

Рейтинг:
0

Patrice T

Цитата:
Кроме того, иногда я получаю одни и те же числа в последних 5 числах.

Случайность случайна, это означает, что вы можете получить один и тот же результат более одного раза, как и с кубиками.
Если вы хотите, чтобы результаты не повторялись, это тасовка, как и с картами, каждый раз, когда вы рисуете карту, она удаляется из оставшихся возможностей.
Перетасовка - Википедия[^]
Фишер–Йейтс шаффл - Википедия[^]