0

Я пытаюсь воссоздать однопользовательскую версию игры в кости Dudo. Самая важная информация состоит в том, что шесть игроков имеют шесть скрытых кубиков, а точка игры состоит в том, чтобы угадать, сколько из определенного типа умирают на столе в целом (например, если есть десять 4 или двенадцать 5 и т. Д.).Python: Биномиальное распространение не работает, если оно задано как переменная

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

chance = ((1/3) ** (i - player_dice_type[turn][active_type])) * ((2/3) ** (total_count - i - player_count[turn] + player_dice_type[turn][active_type])) 

i это число такого рода фильеры (например, шесть 5s, или семь 5s, или восемь 5s и т.д.). У меня есть список того, сколько из каждого типа игрока имеет (player_dice_type), и я могу выбрать конкретный штамп для определенного игрока, подмножество turn и active_type. 1/3 имеет отношение к правилам игры (обычно это будет 1/6 для кубиков), но это никак не связано с моей проблемой.

Когда я вызываю шанс, он ТОЛЬКО дает мне значение, если player_dice_type[turn][active_type] = 0 и i = 6, поэтому вероятность того, что 6 этого штампа находится на столе, когда компьютер имеет 0.

Я могу позвонить i и player_dice_type[turn][active_type] и посмотреть, что они НЕ равны 6 или 0. Дело в том, что если я скопирую и вставляю уравнение, он отлично работает. Он только по умолчанию имеет значение 6 и 0, когда я вызываю вероятность.

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

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

ответ

1

Если вы определили chance как переменную, ее значение было исправлено при его создании. Он не будет «обновляться», если позднее вы измените значение i или что-нибудь еще. Вы не можете «называть» шанс, как вы его определили; это просто статическое значение, а не функция.

Если вы делаете что-то вроде chance = chancefun(i), то устанавливает значение шанса, один раз, и все. Is не «связывает» переменную chance с chancefunc как-то.

Если вы хотите получить разные значения шанса для разных параметров, сделайте его функцией и вызовите его с нужными аргументами. Что-то вроде:

def chance(i, turn, active_type): 
    return ((1/3) ** (i - player_dice_type[turn][active_type])) * ((2/3) ** (total_count - i - player_count[turn] + player_dice_type[turn][active_type])) 

Я предполагаю, что здесь player_dice_type и total_count глобально определенные переменные. Вам нужно будет решить, какие значения вы хотите chance искать глобально и какие из них вы хотите передать при каждом вызове.

+0

Вы правы, спасибо. Это на самом деле застопорило меня какое-то время, и просто написать это заставило меня понять проблему: / –

0

Я думаю, что проблема связана с chance, вычисляя значение в самом начале и удерживая это значение. Когда все загружается, i = 6 и player_dice_type - пустой список (он заполняется позже другой функцией).Позже я могу ввести chance = chancefun(i), как только я сгенерировал некоторые цифры и изменил i, и chance отобразит это точное значение, но снова включится.

Я, возможно, просто продолжу использование функции chancefun (i) без шансов, но я подумал, что было бы очень удобно сохранять все под одной переменной под названием chance, поскольку позже мне пришлось бы суммировать несколько вероятностей