Очень простой скрипт на Python, загадочное поведение

1

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

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

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

  • 0
    Кроме того, похоже, что вы делаете хиты * 1.0 / reps вместо просто hit / reps, как способ заставить систему делать «реальное» деление вместо «целочисленного» деления. Вы также можете просто поместить «из будущего раздела импорта» в верхнюю часть вашего сценария, и тогда он всегда будет выполнять реальное разделение. Вы можете использовать //, чтобы получить «целочисленное» деление, если вам это нужно. Для многих вещей это делает вещи проще.
Теги:

2 ответа

3
Лучший ответ

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

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

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

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

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

  • 0
    Тьфу, теперь я чувствую себя глупо из-за того, что пропустил это, не думай, что это когда-то должно было быть там :(
5

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню