Очень простой скрипт на Python, загадочное поведение - PullRequest
1 голос
/ 14 июня 2009

Прежде всего, я не программист, поэтому ответ на этот вопрос может быть совершенно очевидным для кого-то более опытного. Я играл с python (2.5), чтобы решить некоторую загадку вероятности, однако я продолжал получать результаты, которые были далеки от той отметки, которую я думал, что они должны быть. Поэтому после некоторых экспериментов мне удалось определить поведение, которое вызывало проблему. Сценарий, который, казалось, изолировал странное поведение, таков:

import random
random.seed()
reps = 1000000
sub = [0]*10
hits = 0
first = random.randint(0,9)
while True:
    second = random.randint(0,9)
    if second != first:
        break
sub[first] = 1
sub[second] = 1
sub[random.randint(0,9)] = 1
for i in range(1,reps):
    first = random.randint(0,9)
    while True:
        second = random.randint(0,9)
        if second != first:
            break
    if ((sub[first]) or (sub[second])):
        hits = hits + 1

print "result: ", hits*1.0/reps*100.0

Теперь, это не та проблема, которую я изначально пытался решить, и результат для этого скрипта должен быть 34/90 или около 37,7, что является достаточно простой комбинаторикой. Иногда скрипт дает такой результат, однако чаще всего он дает 53,4, что, кажется, не имеет смысла. Это довольно простое любопытство относительно того, почему именно этот скрипт ведет себя так, как он.

Ответы [ 2 ]

5 голосов
/ 14 июня 2009

Кстати, для лучшего способа «сгенерировать 3 разных случайно распределенных целых числа от 0 до 9 включительно» я от всей души рекомендую a, b, c = random.sample(xrange(10), 3) [[s / xrange / range / in Python 3.0]], а не циклы while вы используете.

3 голосов
/ 14 июня 2009

Результат зависит от того, будет ли строка 13:

sub[random.randint(0,9)] = 1

соответствует тому же индексу, что и одна из строк 11 или 12:

sub[first] = 1
sub[second] = 1

Вы защищаете second от того же самого, что и first, но вы не защищаете эту третью запись от того же самого, что и first или second.

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