Начнём моделировать.
Используется pari/gp
Главная функция:
- simulate_game(N, alice_strategy, bob_strategy) = {
- my(total_payoff = 0, x, y, S, H, guess, is_correct, payoff,bob_win=0);
-
- for (i = 1, N,
- \\ 1. Алиса получает два случайных числа
- x = random(2^32)/2^32;
- y = random(2^32)/2^32;
-
- \\ 2. Алиса делает свой ход
- [S, H] = alice_strategy(x, y);
-
- \\ 3. Боб делает свою догадку
- guess = bob_strategy(S);
-
- \\ 4. Проверяем, прав ли Боб
- is_correct = ((guess == 1 && H > S) || (guess == -1 && H < S));
-
- \\ 5. Рассчитываем выигрыш Боба в этом раунде
- if (is_correct,
- payoff = H;bob_win++,
- payoff = -H
- );
-
- \\ 6. Добавляем к общей сумме
- total_payoff += payoff;
- );
-
- \\ Возвращаем средний выигрыш Боба за N игр
- print("Bob guess rate = ",floor(1/2+100*bob_win/N)," percent.");
- print("Bob average prize = ",total_payoff/N+0.0);
- print("Best approximation = ",bestappr(total_payoff/N,60));
- return(total_payoff / N);
- };
Случайные числа берутся как целые с равномерным распределением из диапазона
![$[0,2^{32}-1]$ $[0,2^{32}-1]$](https://dxdy-01.korotkov.co.uk/f/4/0/7/40765ecd83321da9aa339ef14fc3f46382.png)
Этого должно быть достаточно для симуляции по крайней мере до

раундов игры.
Все вычисления точные без округлений. Округление делается только при печати статистики.
Ну из-за этого есть некоторое смещение: Алиса может получать на вход одно из чисел равное нулю (с вероятностью

), но никогда - равное единице.
Эта же функция одной строкой без пробелов, комментариев и кириллицы, для удобства копипаста в
pari/gp:
(Оффтоп)
- simulate_game(N,alice_strategy,bob_strategy)=my(total_payoff=0,x,y,S,H,guess,is_correct,payoff,bob_win=0);for(i=1,N,x=random(2^32)/2^32;y=random(2^32)/2^32;[S,H]=alice_strategy(x,y);guess=bob_strategy(S);is_correct=((guess==1&&H>S)||(guess==-1&&H<S));if(is_correct,payoff=H;bob_win++,payoff=-H);total_payoff+=payoff;);print("Bob guess rate = ",floor(1/2+100*bob_win/N)," percent.");print("Bob avegage prize = ",total_payoff/N+0.0);print("Best approximation = ",bestappr(total_payoff/N,60));return(total_payoff/N)
Чтобы всё работалo, надо иметь ещё две функции.
1. Стратегия за Алису. Эта функция должна принимать на вход два числа, и отдавать на выход вектор из двух чисел. Первое - то что показывает, второе - скрывает.
Пример "Алиса выбирает равновероятно"
alice_strategy_random(x,y)=if(random(2),return([x,y]),return([y,x]))Пример "Алиса всегда показывает меньшее"
alice_strategy_show_min(x,y)=return([min(x,y),max(x,y)]);Пример " Алиса всегда показывает большее"
alice_strategy_show_max(x,y)=return([max(x,y),min(x,y)]);2. Стратегия за Боба. Эта функция принимает на вход одно число (показанное) и возвращает
1 если Боб считает что показанное больше, и
-1 если Боб считает, что показанное меньше.
Пример "Боб выбирает равновероятно"
bob_strategy_random(S)=if(random(2),return(1),return(-1));Пример "Боб всегда говорит больше"
bob_strategy_say_max(S)=return(1);Пример "Боб говорит меньше и если показанное ему число больше 1/2"
bob_strategy_half(S)=if(S>1/2,return(-1),return(1));Как запускать.
Основная функция
game_simulate(N,alice_strategy,bob_strategy,p) принимает три аргумента
N - количество игр
alice_strategy - имя функции реализующей стратегию за Алису, например
alice_strategy_randombob_strategy - имя функции стратегии за Боба например
bob_strategy_randomВ момент запуска основной функции, функции реализующие стратегии, понятное дело, должны быть уже записаны в интерпретатор
pari/gpФункция печатает статистику -- каков оказался процент угадываний и сколько в среднем выиграл Боб за одну игру.
Функция так же возвращает средний выигрыш Боба.
Запускаем вариант "Алиса выбирает равновероятно, Боб выбирает равновероятно":
Код:
? simulate_game(10^5, alice_strategy_random, bob_strategy_random);
Bob guess rate = 50 percent.
Bob avegage prize = 0.00016247203767998144030570983886718750000
Best approximation = 0
time = 357 ms.
?
Видим что выигрыш нулевой.
Запускаем вариант "Алиса выбирает равновероятно, Боб всегда говорит больше"
Код:
? simulate_game(10^5, alice_strategy_random, bob_strategy_say_max);
Bob guess rate = 50 percent.
Bob avegage prize = 0.16670685586136998608708381652832031250
Best approximation = 1/6
time = 350 ms.
?
Видим что Боб угадывает в половине случаев и его средний выигрыш 1/6
-- 06.07.2025, 13:22 --Соответственно, предлагайте ваши стратегии за игроков, исходя из того что Алисе даются два числа, и она должна вернуть их упорядоченными "показать", "скрыть", а Бобу даётся одно число и он должен вернуть "больше" или "меньше".
Алиса может производить любые вычисления над числами, ей так же доступен генератор случайных чисел с любым распределением. Боб так же может производить любые вычисления над показанным ему числом и ему тоже доступен генератор случайных чисел.