За это время было много работы, и до сегодняшнего дня у меня не было времени ничего написать. Но что лучше выводить? В это время я увидел листок бумаги с написанной на нем группой цифр на рабочем столе по соседству, и вот он! Почему бы тебе не разыграть приз!
анализ проблемы
Лотерея основана на случайности.Пока случайная лотерея решена, может ли она быть разыграна независимо от правил? Итак, нам нужна функция, которая может генерировать случайные числа. Не только случайные числа, но и функция, которая случайным образом принимает целые числа в замкнутом интервале. так
const random = (m, n) => m + Math.floor(Math.random() * (n - m))
Я никогда не ел свинину и видел, как бегают свиньи.Число должно быть нарисовано на единицу меньше, поэтому не бывает ситуации, когда случайные числа могут быть одинаковыми! Таким образом, этот метод не может быть использован. Тогда способ рисования должен соответствовать трем условиям:
- Есть диапазон, это закрытый интервал
- Начальное значение должно быть больше 1
- Случайные числа не могут повторяться
проблема решена
Моя первая мысль о случайном неповторении — использоватьsortМетод случайного измельчения массива. В это время могут быть и другие звуки:
Хотите эту воду?
sortНе знаете, как сортировать?
Вода не вода не знаю, посмотрите на MDN.
arr.sort([compareFunction])
- Если compareFunction(a, b) меньше 0, то a будет отсортировано перед b;
- Если compareFunction(a, b) равно 0 , относительные положения a и b не изменяются. Примечание. Такое поведение не гарантируется стандартом ECMAScript и не гарантируется всеми браузерами (например, Mozilla до 2003 г.);
- Если compareFunction(a, b) больше 0, b будет отсортирован перед a.
- compareFunction(a, b) всегда должна возвращать один и тот же результат сравнения для одних и тех же входных данных, иначе отсортированный результат будет неопределенным.
so
// arr 数组,num 取个数
const random = (arr:number[], num: number) =>
arr.sort(() => Math.random() - 0.5).splice(0, num)
Решить конкретные проблемы
Прежде всего, нам нужно проверить типичные правила игры известных в отрасли лотерейных событий через Baidu:
Лотерейная игра разделена на красную и синюю зоны, где красная зона состоит из 33 номеров от 1 до 33, а синяя зона состоит из 16 номеров от 1 до 16. Вам нужно выбрать 6 номеров в красной области и 1 номер в синей области, чтобы сформировать действительную группу номеров.
Как передний конец азартной собаки, извлеките несколько ключевых моментов из этого отрывка:
- Красная зона 1 ~ 33
- Синяя зона 1 ~ 16
- Возьми 6 красных и 1 синюю.
Только не говори мне, что у меня снова есть функции в голове.
// ...random
const dualColor = () => {
const reds = [1, 2, ..33]
const blues = [1, 2, ..16]
const red = random(reds, 6)
const blue = random(blues, 1)
return [red, blue]
}
А пока давайте посмотрим на метод Ваш метод неверен! Взяв в качестве примера красный цвет, результат нашего функционального выражения таков: после того, как числа будут разбросаны непосредственно, выльются первые 6, а в правилах игры указано, что числа не только выпадают по одному, но и не перестать рассыпаться в процессе. Так что эта случайная функция явно неразумна. Что еще я могу сделать, изменить его!
// 打散后流出第一个和剩下的号码组
function random(arr) {
const newarr = arr.sort(() => Math.random() - 0.5)
const val = newarr.shift()
return [val, newarr]
}
function dualColor() {
let redballs = [1, 2, ..33]
let blueballs = [1, 2, ..16]
let red = [], blue = []
for (let i = 0; i < 6; i++) {
const balls = random(redballs)
red.push(balls[0])
redballs = balls[1]
}
blue.push(random(blueballs)[0])
return [red, blue]
}
практика оптимизации
Честно говоря, написание такой программы может меня задушить...
Никто ведь не пишет такие массивы, верно?
Если я делаю это в соответствии с обычным методом случайных чисел, я предоставляю максимальное значение и минимальное значение, и это заканчивается.Ключ в том, что это массив, и нет ничегоrangeЧто-то подобное можно использовать, никто особо не пишет 1~33 от руки. Но мы можем сделать кривую
// 0 ~ 9
const arr = [...Array(10).keys()]
Таким образом, первая точка преобразует два массива шаров
let reds: number[] = [...Array(33).keys()].map(i => i+1)
let blues: number[] = [...Array(16).keys()].map(i => i+1)
Почему+1Шерстяная ткань? нет номера0Это началось!
Может быть, нам стоит сделать случайную функцию более чистой и общей?
Нам нужно сделать лотерею более гибкой, в конце концов, пока это лотерея, я хочу все. Я хочу, чтобы случайная функция брала массив и нужное мне число и возвращала результат.
Произойдет та же ситуация, что требует зацикливания значений, почему бы нам не использовать рекурсию магического хвоста?
function randomVal(
arr: number[],
total: number,
temp: number[] = [],
): number[] {
const [head, ...body] = arr
.sort(() => Math.random() - 0.5)
return !total
? temp
: randomVal(body, total - 1, temp.concat(head));
}
Я слишком устал, чтобы думать о написании этих двух групп.
изменять! может быть изменено! Мы можем изменить его на кортеж, содержащий начальное и конечное значения.
function dualColor() {
const reds: [number, number] = [1, 33]
const blues: [number, number] = [1, 16]
return [randomVal(reds, 6), randomVal(blues, 1)]
}
Соответствующая случайная функция также немного изменена
function randomVal(
fromto: number[],
total: number,
temp: number[] = [],
): number[] {
const [head, ...body] = (temp.length
? fromto
: [...Array(fromto[1]).keys()]
.map(item => item + 1)
.splice(fromto[0] - 1)
).sort(() => Math.random() - 0.5);
return !total
? temp
: randomVal(body, total - 1, temp.concat(head))
}
Я кажется пропустил правила
Кроме того, есть еще три: (1) Выберите 7--20 в красной области и 1 в синей области. (2) Выберите 6 в красной области и 2--16 в синей области. (3) Выберите 7--20 в красной области и 2--16 в синей области.
Я не понимаю этого, но это нормально, чтобы изменить это.
// 我管你几个,全给你安排上!
function dualColor(red: number = 6, blue: number = 1) {
const reds: [number, number] = [1, 33]
const blues: [number, number] = [1, 16]
return [randomVal(reds, red), randomVal(blues, blue)]
}
Итак, окончательное решение
function dualColor(red: number = 6, blue: number = 1) {
const reds: [number, number] = [1, 33]
const blues: [number, number] = [1, 16]
return [randomBall(reds, red), randomBall(blues, blue)]
}
function randomBall(
fromto: number[],
total: number,
temp: number[] = [],
): number[] {
const [head, ...body] = (temp.length
? fromto
: [...Array(fromto[1]).keys()]
.splice(fromto[0] - 1)
.map(item => item + 1)
).sort(() => Math.random() - 0.5);
return !total
? temp
: randomBall(body, total - 1, temp.concat(head))
}
радует глаз?