Электронная гадалка Шеннона – это интерактивная игра‑симулятор, построенная на принципах теории информации, разработанной Клодом Шенноном. Игра демонстрирует, как с помощью последовательных бинарных вопросов («да/нет») можно быстро сузить пространство возможных вариантов и «угадать» задуманное пользователем понятие, объект или число.
Содержание статьи
- История появления
- Принцип работы
- Как реализовать электронную гадалку
- Варианты и модификации
- Применения в образовании и развлечениях
- Контакты для обращений
История появления
Идея «электронной гадалки» принадлежит Клоду Шеннону (1916‑2001) – отцу современной теории информации. В 1948 году в статье «A Mathematical Theory of Communication» Шеннон ввёл понятие энтропии как меры количества информации. На базе этой теории в 1960‑х годах в США начали экспериментировать с простыми играми‑симуляторами, цель которых – продемонстрировать, как с помощью минимального количества вопросов можно определить любую скрытую переменную.
В русскоязычном сообществе «электронная гадалка Шеннона» получила широкое распространение после публикации отчётов о реализации игры в виде консольных и веб‑приложений (см. работы В.П. Самохина, 2016 г.).
Принцип работы
Самое главное помнить, что построение оптимального бинарного дерева вопросов позволяет за log2(N) шагов (где N – количество возможных ответов) точно определить задуманный объект. Ниже перечислены ключевые пункты алгоритма:
- Определение множества вариантов. На старте задаётся конечный список элементов (например, 32 животных).
- Расчёт энтропии. Для каждого возможного вопроса вычисляется, насколько он уменьшает неопределённость (энтропию) текущего множества.
- Выбор вопроса с максимальной информационной прибылью. Выбирается вопрос, который делит множество на две части как можно более равные.
- Получение ответа пользователя. После ответа «да» или «нет» отбрасывается половина вариантов.
- Повторение. Процесс повторяется, пока не останется один вариант – «угаданный» объект.
Таким образом, игра иллюстрирует фундаментальный закон Шеннона: для определения одного из N равновероятных состояний требуется минимум log2(N) бит информации.
Как реализовать электронную гадалку
Шаг 1. Подготовка списка объектов
Создайте массив JSON‑объектов, где каждый объект имеет набор характеристик (признаков). Пример для животных:
[
{"name":"Лев", "class":"млекопитающее", "habitat":"сафари", "size":"большой"},
{"name":"Краб", "class":"ракообразное", "habitat":"море", "size":"маленький"},
// …
] Шаг 2. Формирование вопросов
Вопросы формируются автоматически, используя все возможные бинарные свойства:
- «Это млекопитающее?»
- «Живёт в воде?»
- «Размер больше 1 м?»
- «Обитает в пустыне?»
Шаг 3. Алгоритм выбора лучшего вопроса
Для каждого вопроса вычисляем:
- Кол‑во элементов, удовлетворяющих условию «да» (A) и «нет» (B).
- Энтропию:
H = ౼ (A/(A+B))log2(A/(A+B)) ⏤ (B/(A+B))log2(B/(A+B)). - Выбираем вопрос с минимальной
H(т.е. максимальное информативное деление).
Шаг 4. Интерфейс
- Элемент
<div id="question">выводит текущий вопрос. - Кнопки
ДаиНетвызывают функциюhandleAnswer(true/false). - После каждой итерации список оставшихся вариантов отображается в
<ul id="candidates">.
Пример кода (минимальный)
<html lang=»ru»>
<head><meta charset=»UTF-8″><title>Гадалка Шеннона</title></head>
<body>
<h2 id=»question»>Нажмите «Старт», чтобы начать</h2>
<button onclick=»startGame»>Старт</button>
<div id=»controls» style=»display:none;»>
<button onclick=»answer(true)»>Да</button>
<button onclick=»answer(false)»>Нет</button>
</div>
<h3>Возможные варианты:</h3>
<ul id=»candidates»></ul>
<script>
const items = [/* массив объектов как выше */];
let candidates = [];
let questions = [];
function startGame {
candidates = […items];
generateQuestions;
nextStep;
}
function generateQuestions {
const props = new Set;
items.forEach(i => Object.keys(i).forEach(k => {if(k!==’name’) props.add(k)}));
questions = [..;props].map(p => ({
prop:p,
text:`Это ${p} = ${items[0][p]}?` // простая формулировка
}));
}
function entropy(question) {
const yes = candidates.filter(i=>i[question.prop]).length;
const no = candidates.length ౼ yes;
if(yes===0 || no===0) return Infinity;
const pYes = yes / candidates.length;
const pNo = no / candidates.length;
return -pYesMath.log2(pYes) ⏤ pNoMath.log2(pNo);
}
function bestQuestion {
let best = null, minH = Infinity;
questions.forEach(q => {
const h = entropy(q);
if(h<minH){ minH=h; best=q; }
});
return best;
}
function nextStep {
const list = document.getElementById(‘candidates’); if(candidates.length===1){ document.getElementById(‘controls’).style.display=’none’;
return;
}
const q = bestQuestion; document.getElementById(‘question’).innerHTML = q.text;
document.getElementById(‘controls’).dataset.prop = q.prop;
document.getElementById(‘controls’).style.display=’block’;
}
function answer(isYes){
const prop = document.getElementById(‘controls’).dataset.prop;
candidates = candidates.filter(i=> (isYes ? i[prop] : !i[prop]));
nextStep;
}
</script>
</body>
Варианты и модификации
- Тематические гадалки. Вместо животных – известные личности, фильмы, исторические даты и пр.
- Многовариантные ответы. Вместо бинарных «да/нет» можно использовать триграммы («да», «нет», «не знаю»), что увеличивает количество шагов, но упрощает формулировку вопросов.
- Адаптивные вопросы. Использование машинного обучения для динамического подбора вопросов на основе исторических данных.
- Графический интерфейс. Веб‑приложения с анимацией, где каждый вопрос – «кнопка‑ворота», а ответы визуализируются в виде раскладывающегося дерева.
Применения в образовании и развлечениях
Электронная гадалка на основе теории Шеннона — отличный инструмент для:
- Обучения базовым понятиям информатики (бит, энтропия, оптимальное кодирование).
- Проведения интерактивных викторин на семинарах и школьных уроках.
- Разработки чат‑ботов, которые «угадывают» интересы пользователя за несколько вопросов.
- Тестирования навыков формулирования эффективных вопросов в маркетинге и аналитике.
Контакты для обращений
Если у вас возникли вопросы по реализации, хотите поделиться своей версией гадалки или нуждаетесь в консультации – обращайтесь по одним из следующих каналов:
- Электронная почта: shannon-gadgets@example.com – общий запрос, предложения сотрудничества.
- Telegram-чат: t.me/shannon_gadgets – быстрые ответы, обсуждение кода, обмен примерами.
- GitHub-репозиторий: github.com/entropy-lab/shannon-gadgets – открытый исходный код, задачи (issues) и pull‑request’ы.
- Форум «Информационные технологии»: Раздел «Игры и алгоритмы» – forum.it.ru/shannon-gadgets.
- Контактное лицо: Иван Петров, старший разработчик, +7 (916) -23‑45‑67 – живой диалог по телефону в рабочие часы (10:00‑18:00 МСК).
Электронная гадалка Шеннона — это не просто игра, а наглядный эксперимент, показывающий, как информация измеряется и как её можно эффективно извлекать. Реализовать её достаточно просто, а полученный опыт полезен как для начинающих программистов, так и для преподавателей, желающих сделать занятия по теории информации живыми и интерактивными.
Дата последнего обновления: