jkeks блог


JavaScript: Генератор случайных чисел, исключая заданный список чисел

16.4.2022 - 329 просмотров ;)

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

// генерим число от 1 до (max) без повторов, повторы в массиве ignoreList
function randomed(max, ...ignoreList){
    let rnd = Math.floor(Math.random()*(max+1))
    while (ignoreList.includes(rnd)===true || rnd===0){
        rnd = Math.floor(Math.random()*(max+1))
    }
    return rnd
}
Вызываем так:

randomed( 100, 1,2,3)
Тогда будет загадано число от 1 до 100  но числа 1,2,3  загадываться не будут.
Тут я использовал две ES6 фичи
… — это деструктуризация
и includes, вместо indexOf, так я и не понял почему indexOf  не срабатывал.
Функция получилась небольшой и красивой
В ней конечно будет косяк если переданных исключений будут все числа в диапазоне до max, тогда видимо процесс зависнет и придется его дропать в браузере как-то. Но это исключительная ситуация, которую я решу лишь когда это действительно мне будет надо, а пока так.
Но что если нам надо передать не список а массив, ведь список задавать руками это идиотизм..
randomed( 100, 1,2,3) // работает
randomed( 100, excludeArray) // не работает

Как тогда быть ?
Правильно деструктуризовать снова..
randomed( 100, …excludeArray) // работает !!
Но это двойная деструктуризация, что, нельзя просто передать массив по олдскульному ?
Конечно можно, и это правильно, нафига нам вся эта деструктуризация туда-сюда..
И это да ! конечный варик на JavaScript, где все чисто и приятно.
Но постойте-ка, у нас повторяется код..
Math.floor(Math.random()*(max+1))
и это не по православному..
Поэтому напишем функцию генерации числа отдельно (вот в PHP почему-то функция совершенно прекрасна, почему в JavaScript функция генерации числа превратилсь в цирк с конями)
Да ! вот теперь все как надо !
Ну и конечно конечный варик
Мой ТОП ссылочных бирж
LinkFeed
Trustlink
Sape
Mainlink
CMSE
Ingots
Megaindex
Linkpad
Setlinks
* Сверху лучшие

 



Сегодня: 2022.11.30