Я наткнулся на шаблон в генераторе случайных чисел - или я получил что-то безумно редкое? - PullRequest
1 голос
/ 12 мая 2019

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

import random

listy = [1]

for _ in listy:
    if random.random() > 0.25:
        listy.append(100)

print(listy)
print(len(listy))

Обычно списки оказывались не такими большими - у большинства было меньше восьми, а у одного было около 12. Когда я продолжал рассылать сообщения с помощью программы около 20-30 раз, я наткнулся на список с 35 элементы.

[1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100]
35

Если вы сделаете математику, то шанс получить это настолько астрономически велик, что я почти начинаю сомневаться, что есть другая причина, по которой я получил этот огромный список; это пример того, когда псевдослучайный генератор действительно псевдослучайный? Я что-то просчитался? Неужели я действительно наткнулся на случай, который нелепо редок?

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

Редактировать: Да, я был безумно глуп. Я планировал расширить список с вероятностью 75%, но рассчитал вероятность того, что он расширится с вероятностью 25%. На 75% это событие не так уж редко. На 25% это почти невозможно.

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Ничего странного в этом нет.

Я добавил пару строк в ваш скрипт, чтобы увидеть, какую длину строки из 100 вы можете увидеть:

import random
from collections import Counter

counter = Counter()
for trials in range(10000):
    listy = [1]
    for _ in listy:
        if random.random() > 0.25:
            listy.append(100)
    counter[len(listy)] += 1
print(counter)

Я запустил его и получил

Counter({1: 2488, 2: 1907, 3: 1386, 4: 1084, 5: 786, 6: 623, 7: 464, 8: 322, 9: 262, 10: 164, 11: 127, 12: 100, 13: 66, 14: 61, 15: 48, 16: 26, 17: 24, 18: 12, 22: 9, 19: 8, 21: 8, 20: 7, 26: 3, 23: 3, 24: 3, 28: 2, 25: 2, 27: 2, 33: 1, 31: 1, 35: 1})

Да, 35 прямо вверх.

Может быть, не так быстро, как вы, но это наверняка произойдет.

0 голосов
/ 12 мая 2019

Похоже, что у вас есть шанс получить 0,005%, вы пробовали 30 раз -> примерно 0,15%, чтобы это произошло.Вы счастливчик: -)

Код для расчета:

import random

hist_data = []
for i in range(1000000):
    listy = [1]

    for _ in listy:
        if random.random() > 0.25:
            listy.append(100)
    hist_data.append(len(listy))

big_numbers = [i for i in hist_data if i >= 35]
print("Chance for >=35: %.4f%%" % (100.*len(big_numbers)/len(hist_data)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...