Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Yuriy Al. Shirokov ([info]yushi)
@ 2008-10-28 23:47:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Вопрос знатокам Питона
Читали тут со [info]zmey про парадокс Монти Холла, написали скриптик для наглядной демонстрации (мне самому, прежде всего, я формулам верю меньше, чем коду):

#!/usr/bin/python

from random import randint

wins = 0

for i in range(0, 1000):
    prize = randint(0,2)
    choice = randint(0,2)
    not_choosed = [j for j in range(3) if j != choice]
    goats = [j for j in not_choosed if j != prize]
    random_goat = goats[randint(0, len(goats) - 1)]
    [new_choice] = [j for j in not_choosed if j != random_goat]
    if (new_choice == prize):
        wins += 1
print i, "iterations", wins, "wins"


Ну, типа, если мы нумеруем двери цифрами 0, 1, 2, то prize — номер двери с автомобилем, choice — первоначальный выбор игрока, not_choosed — номера невыбранных дверей, goats — номера тех из невыбранных дверей, за которыми козы, random_goat — номер той из дверей с козой, которую открывает ведущий, new_choice — оставшаяся дверь. А wins это количество выигрышей, понятно.

Собственно, subj: как это сделать изящнее? А то уж больно много строк (и переменных) для такой простой задачки, мне кажется, что из Питона можно выжать больше. Без пренебрежения читабельностью, разумеется.

А про парадокс Монти Холла я прочитал вот в этом посте, который нашёл благодаря вот этой ссылке от [info]azatiy.


(Добавить комментарий)


[info]a_karpov
2008-10-29 00:08 (ссылка)
гыгыгы, я только на прошлой неделе тоже делал круглые глаза и не верил, что надо менять выбор. Убежден был вот как:

есть десять дверей, за одной конфета, за другими пусто. Я выбираю одну, мне открывают восемь других, пустых. Итак, конфета за одной из оставшихся двух дверей. Если я считаю, что вероятность того, что она за моей изначально выбранной дверью, равна теперь одной второй - пусть так! Значит, если я не изменю свой выбор, то побеждаю с вероятностью в одну вторую.

А теперь, собственно, фокус - раз я так считаю, и раз я заранее знаю, что не изменю выбора, и раз я заранее знаю, что мне откроют восемь дверей где пусто, то я вообще никакой новой информации не получил. То есть, ведущий ничего вообще может не открывать, а я просто выбираю одну дверь из десяти.
Итак, одна вторая равна одной десятой, противоречие.

(Ответить) (Ветвь дискуссии)


[info]yushi
2008-10-29 00:17 (ссылка)
А теперь, собственно, фокус

Во. Это понятное объяснение, почему интуитивное решение неверно, я, кстати, до него не додумался. Tnx.

(Ответить) (Уровень выше)

(Комментарий удалён)

[info]yushi
2008-10-29 03:55 (ссылка)
Действительно, так лучше. Спасибо.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yushi
2008-10-29 03:59 (ссылка)
А, нифига, нам список not_choosed нужен дальше. Пойду-ка я спать, не соображаю уже.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]mojo.coil.ru
2008-10-29 04:04 (ссылка)

for i in range(0, 1000):
prize = randint(0,2)
choice = randint(0,2)
if prize == choice:
continue
wins += 1

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]mojo.coil.ru
2008-10-29 04:06 (ссылка)
что при больших циклах, очевидно, сводится к


win_chance = 2/3

(Ответить) (Уровень выше)


[info]mojo.coil.ru
2008-10-29 04:08 (ссылка)

for i in range(0, 1000):
prize = randint(0,2)
choice = randint(0,2)
if prize != choice:
wins += 1

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]mojo.coil.ru
2008-10-29 04:09 (ссылка)
trigger happy, тоже пора спать


for i in range(0, 1000):
if randint(0,2) != randint(0,2):
wins += 1

(Ответить) (Уровень выше)


[info]yushi
2008-10-29 11:55 (ссылка)
Э, нет. Так можно и print "2/3" написать.

Скрипт всё же должен иллюстрировать процесс выбора, чтобы, скажем, распечатка значений на каждом шаге показала бы, как оно работает (или можно было бы отобразить процесс вообще графически, для самых тупых). То есть наша задача именно построить модель, а не получить аналогичный результат вычислений.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]mojo.coil.ru
2008-10-29 16:39 (ссылка)
просто, упрощая ваш код, получается именно это.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yushi
2008-10-29 19:54 (ссылка)
Угу, недостаточно ясно сформулировал вопрос, похоже.

За идею с remove() спасибо по-любому.

(Ответить) (Уровень выше)


[info]polytheme
2008-11-08 21:08 (ссылка)
в книжке Кормена, Лейзерсона и Ривеста эта задача идет в паре с такой:
начальник тюрьмы случайно выбирает одного из трех заключенных - его выпустят на свободу, а остальных двоих казнят. до оглашения амнистии заключенных запрещено информировать об их собственной судьбе. заключенный X обращается к охраннику, знающему, кого амнистируют, со следующей просьбой: среди Y и Z казнят хотя бы одного; Х просит назвать казнимого. охранник соглашается с аргументами X и говорит, что казнят Y. А X радуется, рассуждая следующим образом: из оставшихся казнят либо его, либо Z, т.е. его шансы теперь половина, а не треть. прав ли он, или охранник не нарушил запрета ?

(Ответить)