предложение лотереи питона - PullRequest
0 голосов
/ 23 декабря 2009

Я знаю, что Python предлагает случайный модуль для простой лотереи. Допустим, что random.shuffle () хорош.

Однако я хочу построить свой собственный простой. На что мне обратить внимание? Есть ли какая-то конкретная математическая философия за лотереей?

Допустим, самая простая ситуация. 100 имен и генерировать 20 имен случайным образом.

Я не хочу использовать shuffle, так как я хочу научиться создавать его самостоятельно.

Мне нужно несколько советов, чтобы начать. Спасибо.

Ответы [ 5 ]

4 голосов
/ 23 декабря 2009

Вы можете генерировать свои собственные псевдослучайные числа - за этим стоит огромное количество теорий, начните, например, здесь - и, конечно, вы не сможете конкурировать с Python random «Mersenne twister» (объясняется на полпути вниз по большой странице википедии, на которую я вам указал), либо в качестве, либо в скорости, но для целей понимания это хорошее начинание. Или вы можете получить физически случайные числа, например, из /dev/random или /dev/urandom на компьютерах с Linux (машины Windows также имеют свои собственные интерфейсы для этого) - одна имеет более резкую физическую случайность, другая имеет лучшую производительность .

Как только у вас есть (или заимствуете у random ;-) генератор псевдослучайных (или действительно случайных) чисел, выбор 20 случайных элементов из 100 по-прежнему представляет собой интересную проблему. Несмотря на то, что тасование является более общим подходом, более понятным может быть следующий, если предположить, что ваша myrand(N) функция возвращает случайное или псевдослучайное целое число между 0 включенным и N исключенным:

def pickfromlist(howmany, thelist):
  result = []
  listcopy = list(thelist)
  while listcopy and len(result) < howmany:
    i = myrand(len(listcopy))
    result.append(listcopy.pop(i))
  return result

Определенно, не максимально эффективный, но, я надеюсь, максимально понятный! -) Словом: если это необходимо и выполнимо, выберите один случайный элемент из оставшихся (вспомогательный список listcopy дает нам «оставшиеся» "на любом этапе, и изменяется .pop без изменения входного параметра thelist, так как это мелкая копия).

3 голосов
/ 23 декабря 2009
2 голосов
/ 23 декабря 2009

Я восхваляю ваше желание сделать это самостоятельно.

Еще в 1950-х годах случайные числа были недоступны большинству людей без суперкомпьютера (того времени). Корпорация RAND опубликовала книгу под названием миллион случайных цифр с 100 000 нормальных отклонений , в которой буквально были только случайные числа. Это было потрясающе, потому что позволяло непрофессионалам использовать случайные числа высокого качества для исследовательских целей.

Теперь вернемся к вашему вопросу.

Я рекомендую вам прочитать инструкции о том, как использовать книгу (да, она поставляется с инструкциями), и попытаться реализовать это в своем коде Python. Это не будет эффективным или элегантным, но вы поймете последствия алгоритма, который вы в конечном итоге согласитесь. Мне нравится та часть, которая инструктирует тебя

открыть книгу на невыбранной странице таблицу цифр и слепо выбрать пятизначное число; этот номер с первое число уменьшено по модулю 2 определяет стартовую линию; два цифры справа от изначально выбранное пятизначное число уменьшается по модулю 50 для определения начального столбец в стартовой строке

Читать эту таблицу чисел было искусством!

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

Моя работа требует, чтобы я использовал высококачественные случайные числа, в ограниченных случаях я нашел сайт www.random.org очень хорошим источником информации и материалов. С их сайта:

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

А теперь иди и проведи свою собственную лотерею.

1 голос
/ 23 декабря 2009

Вы можете использовать: random.sample

Возвращает список уникальных длин k элементы, выбранные из населения последовательность. Используется для случайной выборки без замены.

Для более низкоуровневого подхода используйте random.choice в цикле:

Вернуть случайный элемент из непустая последовательность seq.

Псевдослучайный генератор (PRNG) в Python довольно хорош. Если вы хотите перейти на еще более низкий уровень, вы можете реализовать свой собственный. Начните с чтения этой статьи . Математическое название для лотереи "выборка без замены". Google, что для информации - вот хорошая ссылка .

0 голосов
/ 23 декабря 2009

Основным недостатком программных методов генерации лотерейных номеров является тот факт, что все случайные числа, сгенерированные программным обеспечением, псевдослучайные .

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

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

Как я уже сказал, это может не учитываться для вашего простого приложения, но главное требование настоящей лотереи («особая математическая философия») должно быть математически очевидной случайностью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...