Получение случайного числа каждый раз в скрипте

102
8

У меня возникли проблемы со следующим кодом:

from random import randint
class character():
__init__(self):
#init stuff here
def luck(self, Luck = randint(0, 3)):
return Luck

Я должен вызвать этот метод несколько раз в моем скрипте для нескольких экземпляров, чтобы каждый раз получать разные номера. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я называю этот метод, независимо от того, в каком экземпляре, я всегда получаю тот же результат. Например, в следующем коде:

Foo = character()
Bar = character()
for foobar in range(3):
print(Foo.luck(), Bar.luck())

Я получаю в качестве вывода:

1 1
1 1
1 1

Кстати, в моем коде я использовал randint(0, 3) как аргумент метода luck() потому что в некоторых конкретных ситуациях я хотел бы сам присваивать значения.

Вернемся к делу, как я могу получить разные цифры каждый раз?

спросил(а) 2021-01-19T13:50:56+03:00 9 месяцев, 1 неделя назад
1
Решение
91

Это определение функции удачи. Если пользователь указывает номер, он будет возвращен. Если вместо этого не указывается аргумент, Luck будет установлен из randint и возвращается случайное значение.

def luck(self, Luck = None):
if Luck is None:
Luck = randint(0,3)
return Luck

ответил(а) 2021-01-19T13:50:56+03:00 9 месяцев, 1 неделя назад
79

В python выражения по умолчанию, задающие значения по умолчанию для аргументов функции, выполняются только один раз. Это означает, что, как только вы определите метод luck, любое значение randint() первый раз для всех вызовов.

Чтобы получить новое случайное число каждый раз, когда вызывается метод, вам нужно вызвать его внутри тела метода:

class Character(object):
@staticmethod # required if you're not accepting 'self'
def luck():
return randint(0, 3)

Это будет работать так, как ожидалось.

ответил(а) 2021-01-19T13:50:56+03:00 9 месяцев, 1 неделя назад
47

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

ответил(а) 2021-01-19T13:50:56+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема