Игра Пенни
У игроков имеется, допустим, по 50 монет, а ещё 50 лежат в мешочке на столе. Впрочем, подойдут и шашки, которые можно переворачивать, квадратики из бумаги, одна сторона которой не белая и вообще любые предметы, имеющие два состояния, которые можно закодировать нулём и единицей.
Право первого хода любезно уступаем сопернику, он выкладывает любую последовательность из трёх своих монет, например, "орёл" - "решка" - "орёл" или 1 - 0 - 1. Второй игрок отвечает такой же последовательностью из трёх двоичных чисел.
После этого начинаем выкладывать "вслепую" третью последовательность из "ничейных" монет, делая это до тех пор, пока в новой последовательности не встретится цепочка "орлов" и "решек" какого-либо из игроков. Иногда кладут сразу 5 монет и потом при необходимости добавляют ещё по одной, пока не встретится чья-то последовательность. Чья цепочка "орлов" и "решек" встретилась первой, тот выиграл этот ход и забирает три монеты соперника, а монеты из мешочка можно возвращать обратно, не суть дела. Когда у одного из соперников не осталось монет, всё закончилось и все деньги достались победителю.
Можно утверждать почти наверняка, что если я буду вторым игроком, все ваши монеты при достаточно длинной серии ходов неизбежно перекочуют ко мне :) Всё дело в том, что эта игра не имеет нулевой суммы и для любой тройки первого игрока (из восьми возможных троек) найдётся такая тройка второго игрока, которая выигрывает с вероятностью, большей 1/2. Вы можете менять стратегию на каждом ходу или ходить всё время одной и той же последовательностью, это ничего не изменит.
Называется это чудо математческого "мошенничества", приводившее в ярость самого Гарднера, игрой Пенни.
Ниже можно поиграть с компьютером (бесплатно!) и посмотреть исходник в виде файла .html
без обрамления заголовочными тегами. Ход состоит в том, что вы отмечаете нужные чекбоксы из трёх и нажимаете кнопку OK :) Все необходимые элементы разметки игра создаёт себе сама в разделе с идентификатором pennyId
. Для сброса можно просто обновить страницу клавишей F5
.
<div style="text-align:justify;margin:auto;width:850px;" id="pennyId"></div> <script> var penny = function (gameId) { var check = []; var divId = document.getElementById (gameId); for (var i=1; i<4; i++) { check[i] = document.createElement('input'); check[i].type = "checkbox"; check[i].name = "check"; check[i].value = "1"; check[i].id = "id"+i; divId.appendChild (check[i]); } var btn = document.createElement('input'); btn.type = "button"; btn.value = "OK"; divId.appendChild (btn); var txt = document.createElement('p'); divId.appendChild (txt); var step = 1; var cnt = [ 0, 0 ]; var b3arr = [ 4,4,1,1,6,6,3,3 ]; //самая главная стратегия :) btn.addEventListener ("click", function(e) { //клик по кнопке var a3 = (check[1].checked<<2) | (check[2].checked<<1) | (check[3].checked); var b3 = b3arr[a3].toString(2); var human = (check[1].checked|0)+','+(check[2].checked|0)+','+(check[3].checked|0); var comp = ((b3&4)>>2)+','+((b3&2)>>1)+','+(b3&1); var rands = rnds(5); //сначала 5 бросаний var res; while (1) { var humanIndex = rands.indexOf (human); var compIndex = rands.indexOf (comp); if (humanIndex > -1 && (humanIndex < compIndex || compIndex == -1)) { res = 'вы выиграли'; cnt[0]++; break; } if (compIndex > -1 && (compIndex < humanIndex || humanIndex == -1)) { res = 'я выиграл'; cnt[1]++; break; } rands += ',' + Math.round(Math.random()); } txt.innerHTML = 'Шаг '+(step++)+', ваш ход: '+ human +', мой ход: '+ comp +', числа: '+ rands + ', <b>'+res+'</b>, счёт 😎'+cnt[0]+' : '+cnt[1]+'💻'+'<br>' + txt.innerHTML; function rnds(n) { //строка из n случайных 0 и 1 var a = []; for (var i=0; i<n; i++) a[i]=Math.round(Math.random()); return a.join(','); } }); } window.addEventListener('load', function (e) { penny ("pennyId"); }); </script> <noscript> <p style="text-align: center;">Нужен включённый в браузере Javascript для работы приложения!</p> </noscript>
06.11.2019, 01:11 [2160 просмотров]