Настройка оператора Python .seed и .randrange if-else

Моя программа очень сложная, ниже я привожу более простую версию:

while True:#This first part asks the user if he wants to run in deterministic mode(explained later) If he does then deterministic is given a value of 1, else, it is given a value of two.
    mode= input("Would you like to start the program in deterministic mode?(y/n)")
    for i in mode:
        if i not in ('yYnN'):
            print('Please enter either a \'y\' or an \'n\', Please try again')
            break
    else:
        break

if mode=='y' or mode== 'Y':
    deterministic= 1
elif mode=='n' or mode=='N':
    deterministic= 2

Теперь ниже приведен код, который использует приведенный выше код. Это оператор if-elif, в котором, если детерминированный == 1, будет запущена функция, а если детерминированный == 2, то будет запущена другая функция.

        if deterministic==2:#position,time, and energy variables will come from the function updateDisplayAllVar(....)

            position,time,energy=updateDisplayAllVar(selection,position,time,energy)
        elif deterministic==1:#position,time, and energy variables will come from the function deterministic(....)

            position,time,energy=deterministic(selection,position,time,energy)

Теперь я покажу вам две функции из приведенного выше кода. Проблема в них, я считаю. Первая функция дает случайное число и, возможно, каждый раз новое случайное число. Вторая функция использует .seed, чтобы каждый раз ограничивать случайное число одним и тем же «случайным» числом.

def updateDisplayAllVar (выбор, положение, время, энергия):

if selection=='w' or selection =='W':
    energy= energy
    position= position+1
    time=time+1
elif selection=='j' or selection =='J':
    energy= energy-1
    position= position+2
    time=time+1 
elif selection=='r' or selection =='R':
    energy= energy-random.randrange(1,2+1)
    position= position+random.randrange(1,4+1)
    time=time+1
elif selection=='f' or selection =='F':
    energy= energy- random.randrange(3,5+1)
    position= position+random.randrange(3,8+1)
    time=time+1



def deterministicMode(selection,position,time,energy):

    if selection=='w' or selection =='W':
        energy= energy
        position= position+1
        time=time+1
    elif selection=='j' or selection =='J':
        energy= energy-1
        position= position+2
        time=time+1 
    elif selection=='r' or selection =='R':
        random.seed(1)
        energy= energy-random.randrange(1,2+1)
        position= position+random.randrange(1,4+1)
        time=time+1
    elif selection=='f' or selection =='F':
        random.seed(3)
        energy= energy- random.randrange(3,5+1)
        position= position+random.randrange(3,8+1)
        time=time+1

Теперь моя проблема заключается в том, что с этим кодом, даже если я не выберу детерминированный (без случайных чисел) режим, я все равно получаю числа, которые не являются случайными и основаны на второй функции. То есть, несмотря на то, что там есть две функции, и я прошу, чтобы каждая функция выполнялась на основе пользовательского ввода... Всегда выполняется deterministicMode(selection,position,time,energy). Кто-нибудь знает исправление. Пожалуйста, дайте мне знать, если что-то неясно, и я это исправлю.


person SeesSound    schedule 23.11.2012    source источник
comment
Попробуйте использовать random.seed() (без каких-либо аргументов), чтобы снова сбросить RNG, чтобы он был случайным.   -  person Blender    schedule 24.11.2012
comment
@Blender, еще раз привет, а где именно это установить?   -  person SeesSound    schedule 24.11.2012
comment
Попробуйте поместить его в первую строку функции deterministicMode.   -  person Blender    schedule 24.11.2012
comment
@Blender вместо оригинального .seed?   -  person SeesSound    schedule 24.11.2012
comment
.seed() (без аргументов) задает ГСЧ текущим системным временем, что снова делает его случайным. Если вы этого не сделаете, ваш ГСЧ будет продолжать использовать начальное значение 3 или 1. Просто вставьте random.seed() сразу после def deterministicMode(selection,position,time,energy): и посмотрите, поможет ли это.   -  person Blender    schedule 24.11.2012


Ответы (1)


Просто повторно введите в свой ГСЧ текущее системное время, чтобы снова сделать его «случайным»:

def deterministicMode(selection,position,time,energy):
    random.seed()  # <-- Add this line right here

    if selection=='w' or selection =='W':
        energy= energy
        position= position+1
        time=time+
person Blender    schedule 23.11.2012