как найти три одинаковых значения подряд в python - PullRequest
0 голосов
/ 05 февраля 2019

Предположим, что случайные числа выбираются по одному с заменой из набора 0, 1, 2, ..., 8, 9. Используйте 10000 симуляций для оценки среднего числа значений, необходимых для выбора трех одинаковых значений встрока.

Вот код, который я пробовал:

import numpy as np

newlist = 0*[0]
ct = 0
set = [0,1,2,3,4,5,6,7,8,9]
random = np.random.choice(set, size=1)
for i in range(10000):
    if random == random:
        ct +=1
        while ct == 3:
            newlist.append()
print(random)

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Теоретически вы должны ожидать, что ожидаемое значение будет n * 1/n^3, что составляет 1/n^2, учитывая, что у вас есть n числа в вашем первоначальном списке.Для его моделирования я бы выбрал следующее:

import numpy as np

count = 0
num_iterations = 1000
numbers = [0,1,2,3,4,5,6,7,8,9]
for _ in range(num_iterations):
    if len(set(np.random.choice(numbers, 3, replace=True))) == 1:
        count += 1

print("Avg is {}".format(count/num_iterations))

Объяснение:

Поскольку numpy.choice с заменой равномерно выбирает три члена из numbers, случай трех последовательных выборов:это же число эквивалентно наличию набора с количеством элементов, равным 1. Если вы увеличите num_iterations примерно до 10000, вы увидите, что он моделирует случай с приемлемой точностью (среднее значение будет около 0,01), что ожидается.

0 голосов
/ 05 февраля 2019

Алгоритм

  1. Создание окна из 3 случайно выбранных элементов из вашего набора
  2. Инициализация счетчика, который будет содержать количество раз, когда найдено равенство 3 элементов
  3. На каждой итерации сдвигайте окно влево и добавляйте новый случайно выбранный элемент
  4. Если все элементы в окне равны, увеличивайте счетчик
  5. Повторяйте 3 и 4, пока не увидитезакончил 10000 симуляций

код

import random

# [1, 2, 3] + 4 => [2, 3, 4]
def shift_left(arr, new_value):
    arr[0:len(arr) - 1] = arr[1:len(arr)]
    arr[len(arr) - 1] = new_value
    return arr

# [1, 1, 1] => True | [1, 2, 3] => False
def all_equal(window):
    for j in range(len(window) - 1):
        if window[j] != window[j+1]:
            return False
    return True

# Where real work happens
def avg(number_of_simulations, row_size, possible):
    number_of_equals = 0
    window = [random.choice(possible) for _ in range(row_size)] # window generation
    if all_equal(window):
        number_of_equals += 1

    for i in range(number_of_simulations - row_size):
        # Add new random number AND remove number from 3 iterations before
        window = shift_left(window, random.choice(possible))
        if all_equal(window):
            number_of_equals += 1 # Increment if all items are equal

    return number_of_equals

if __name__ == '__main__':
    possible_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    number_of_simulations = 10000
    row_size = 3
    answer = avg(number_of_simulations, row_size, possible_values)
    print(f'Found {answer} among {number_of_simulations}')
0 голосов
/ 05 февраля 2019

как насчет:

opts = list(range(9))

# simulate once
def get_three(): 
    c = 1
    x = np.random.choice(opts, 1)
    i = 1
    while c < 3:
        x1 = np.random.choice(opts, 1)
        if x == x1:
            c += 1
        else:
            x = x1
            c = 1
        i += 1
    return i

# simulate n times
n = 10000 
result = sum([get_three() for i in range(n)]) / n
result # 90.5146
0 голосов
/ 05 февраля 2019

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

import numpy as np
from collections import deque

results = []
number_selection = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for _ in range(10000):
    _iterations = 1
    d = deque(maxlen=3)

    while True:
        random_value = np.random.choice(number_selection, size=1)
        if len(d) == 3 and len(set(d)) == 1:  # if last three items added to deque were equal we add the number of iterations to results and break to next loop
            results.append(_iterations)
            break  # break the while loop

        _iterations += 1
        d.append(random_value.item())

print('Average is: {0}'.format(float(sum(results)) / max(len(results), 1)))

Надеюсь, это поможет!

...