прежде всего, я не программист, поэтому ответ на это может быть совершенно очевидным для кого-то более опытного. Я играл с 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 ведет себя так, как он.
Результат зависит от того, будет ли строка 13:
sub[random.randint(0,9)] = 1
показывает тот же индекс, что и один из строк 11 или 12:
sub[first] = 1
sub[second] = 1
Вы защищаете second
от того же значения, что и first
, но вы не защищаете эту третью запись от того, что один из first
или second
.
BTW, чтобы наилучшим образом "генерировать 3 разных случайных распределенных целых числа между 0 и 9 включенными", я сердечно рекомендую a, b, c = random.sample(xrange(10), 3)
[[s/xrange/range/in Python 3.0]] вместо циклов while
вы используете.