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

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]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() спасибо по-любому.

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


(Читать комментарии) -