Выполните повторяемый взвешенный бросок монеты на основе UUID

#python #python-3.x #uuid

Вопрос:

Я генерирую UUID, используя uuid.uuidv4()

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

Вот что я придумал:

 def execute_weighted_coin_toss(uuid_key, success_rate):
    # extracts only numbers from uuid to get a number from 0 to 1
    uuid_as_number = float('0.'   ''.join(filter(str.isdigit, str(uuid_key))))
    return uuid_as_number < success_rate
 

Мой вопрос: дает ли эта функция равномерное случайное распределение на основе uuid?

Окончательное редактирование: Я добавил следующий тест, и он сработал очень хорошо.

 

def start():
    for success_rate in range(5, 100, 5):
        trials = 1000000
        result = []
        for i in range(trials):
            result.append(execute_coin_toss(uuid_key=uuid.uuid4(), success_rate=success_rate / 100))
        actual_success_rate = (sum(result) / trials) * 100
        print(f'expected_success_rate={success_rate}%,actual_success_rate={actual_success_rate}%')


def execute_coin_toss(uuid_key, success_rate):
    as_repeatable_random_number = float('0.'   ''.join(filter(str.isdigit, str(uuid_key))))
    return as_repeatable_random_number < success_rate


if __name__ == '__main__':
    start()
 

Комментарии:

1. Нет, конечно, нет. Кроме того, должен ли бросок монеты быть чувствителен к вероятности успеха? То есть должны c(u, 0.5) быть соотнесены c(u, 0.6) или полностью независимы?

2. Не могли бы вы объяснить, пожалуйста, почему нет? Цифры в UUID не являются случайными? Бросок монеты должен быть чувствителен к скорости успеха в том смысле, что, если скорость успеха составляет 90%, например, 90% случайно сгенерированного UUID должны передать его. @orlp

3. Но что, если я попрошу два броска монеты с одинаковым UUID, но разными показателями успеха?

Ответ №1:

Давайте докажем это с помощью простого Монте-Карло:

 import uuid

trials = 100000
rate = 0.6
result = []
for i in range(trials):
   result.append(execute_weighted_coin_toss(uuid.uuid4(), rate))

print(sum(result)/trials)
 

Ответ: короче говоря, да