Бесконечный цикл в симуляции - PullRequest
0 голосов
/ 27 мая 2011

Я начинаю с python. Подробности, которые я написал ниже. Идет к бесконечному циклу и выдает ошибку, когда я пытаюсь вызвать функцию внутри себя.Разрешено?

Размещать код ниже. Спасибо за вашу помощь:)

Программа предполагает, что у нас 100 пассажиров, которые садятся в самолет.Если предположить, что первый потерял посадочный талон, он находит случайное место и садится там.Затем остальные входящие пассажиры сидят на своих местах, если они не заняты, или на каком-то другом случайном месте, если они заняты.Конечная цель - найти вероятность того, что последний пассажир не сядет на свое место.Я еще не добавил часть цикла, которая могла бы сделать правильную симуляцию.Вопрос выше на самом деле загадка в вероятности.Я пытаюсь проверить ответ, потому что я действительно не следую рассуждениям.

import random
from numpy import zeros

rand = zeros((100,3))
# The rows are : Passenger number , The seat he is occupying and if his designated     seat is occupied. I am assuming that the passengers have seats which are same as the order in which they enter. so the 1st passenger enter has a designated seat number 1, 2nd to enter has no. 2 etc.

def cio(r):  # Says if the seat is occupied ( 1 if occupied, 0 if not)
    if rand[r][2]==1:
        return 1
    if rand[r][2]==0:
        return 0

def assign(ini,mov):    # The first is passenger no. and the second is the final seat he gets. So I keep on chaning the mov variable if the seat that he randomly picked was occupied too. 
    if cio(rand[mov][2])== 0 :
        rand[mov][2] = 1
        rand[mov][1] = ini
    elif cio(rand[mov][2])== 1 :
        mov2 = random.randint(0,99)
 #       print(mov2)            Was used to debug.. didn't really help
        assign(ini,mov2)        # I get the error pointing to this line :(

# Defining the first passenger's stats.
rand[0][0] = 1
rand[0][1] = random.randint(1,100)
m = rand[0][1]
rand[m][2]= 1

for x in range(99):
    rand[x+1][0] = x + 2

for x in range(99):
    assign(x+1,x+1)

if rand[99][0]==rand[99][1] :
    print(1);
else :
    print(0);

Пожалуйста, скажите мне, если у вас возникнет та же ошибка .. Также скажите мне, если я нарушаю какие-либо правила, потому что этоПервый вопрос, который я отправляю. Извините, если он кажется слишком длинным.

Вот как это должно было быть ... Код в этом случае работает нормально со следующими модами:

def assign(ini,mov):
if cio(mov)== 0 :     """Changed here"""
    rand[mov][2] = 1
    rand[mov][1] = ini
elif cio(mov)== 1 :    """And here"""
    mov2 = random.randint(0,99)
    assign(ini,mov2)  

Я использую Python 2.6.6 на Windows 7, использую программное обеспечение от Enthought Academic Version Python.http://www.enthought.com/products/getepd.php

Кроме того, ответ на эту загадку - 0.5, что фактически является тем, что я получаю (почти), выполняя ее 10000 раз.

Я не видел ее здесь, но пришлосьбыть доступным онлайн .. http://www.brightbubble.net/2010/07/10/100-passengers-and-plane-seats/

Ответы [ 2 ]

0 голосов
/ 27 мая 2011

вы можете найти точное решение с помощью динамического программирования http://en.wikipedia.org/wiki/Dynamic_programming Для этого вам нужно добавить памятку в рекурсивную функцию: Что такое памятка и как ее использовать в Python?

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

для измерения глубины вы можете добавить целое число к вашим параметрам: е (глубина): если глубина> 10: вернуть что-то остальное: f (глубина + 1)

максимальная глубина рекурсии, разрешенная по умолчанию, составляет 1000, хотя вы можете изменить это, вам просто не хватит памяти, прежде чем вы получите ответ

0 голосов
/ 27 мая 2011

Рекурсия, хотя и разрешена, не лучший выбор для этого.

Python устанавливает верхнюю границу для рекурсивных функций. Похоже, что ваш цикл превышает верхнюю границу.

Вы действительно хотите какой-то цикл while в назначении.

def assign(ini,mov):    
   """The first is passenger no. and the second is the final seat he gets. So I keep on chaning the mov variable if the seat that he randomly picked was occupied too. 
   """
   while cio(rand[mov][2])== 1:
      mov = random.randint(0,99)

   assert cio(rand[mov][2])== 0
   rand[mov][2] = 1
   rand[mov][1] = ini

Это может быть больше, чем вы пытаетесь сделать.

Обратите внимание на изменения в ваших комментариях. Строка в тройных кавычках сразу после def.

...