Как смоделировать кубик с честной монетой


21

Предположим, что вы получили честную монету и хотели бы смоделировать распределение вероятностей многократного подбрасывания честного (шестигранного) кубика. Моя первоначальная идея состоит в том, что нам нужно выбрать подходящие целые числа , такие что . Таким образом, после подбрасывания монеты раз, мы отображаем число, закодированное цепочкой битов длины k, на выходы матрицы, разделив диапазон на 6 интервалов, каждый из которых имеет длину . Однако это невозможно, так как имеет два в качестве единственного простого множителя, а простые множители в включают три. Должен быть какой-то другой простой способ сделать это, верно?2 k = 6 m k [ 0 , 2 k - 1 ] m 2 k 6 mk,m2k=6mk[0,2k1]m2k6m


Посмотрите на этот вопрос, где проблема рассматривается более общим образом.
Рафаэль

Вот статья на эту тему . В нем объясняется, как использовать выборку отбраковки и как повторно использовать «потраченные впустую» биты для ускорения последующих бросков.
ZeroUltimax

Ответы:


12

Чтобы иметь немного более эффективный метод, чем тот, на который указал @FrankW, но используя ту же идею, вы можете перевернуть свою монету раз, чтобы получить число ниже . Затем интерпретируйте это как пакет из die flips, где - наибольшее число, так что (как уже говорилось, равенство здесь никогда не выполняется). Если вы получите число, большее или равное вы должны отклонить значение и повторить все шагов.2 n m m 6 m < 2 n 6 m nn2nmm6m<2n6mn

Вы можете реализовать функцию, которая возвращает один бросок кристалла, сделав бросков монет, а затем кэшируя результат для следующих запросов броска кристалла.м - 1nm1

Интересным моментом является то, что некоторые значения лучше, чем другие, потому что они имеют меньший коэффициент отклонения. Вот список хороших значений (то есть значений, которые имеют более низкий показатель отклонения, чем предыдущие):n

n m r
3 1 0.25
8 3 0.15625
13 5 0.05078125
44 17 0.0378308072686
75 29 0.0247036782182
106 41 0.0113974522704
243 94 0.00933096248381
380 147 0.00726015308463
517 200 0.00518501504347
654 253 0.00310553931213
791 306 0.00102171682348

получено по формулам: .

m=nlog32r=13m2n

Первая строка соответствует ответу @FrankW с процентом брака 25%. Следующие числа хороши: и могут храниться в одной целочисленной статической переменной. В частности, процент брака составляет всего 5%, что является ощутимым улучшением по сравнению с 25% и делает его хорошим кандидатом для возможной реализации.n = 13 n = 13n=8n=13n=13


Вам не нужно 6 ^ м, 6 * м достаточно. Таким образом, вы можете использовать 5 бросков, чтобы получить 5-битное число, отклоняющее только 1/16 случаев.
Темыр

Отклонение 5% для 13 бросков ужасно по сравнению с 25% для 3 бросков. Потому что 25% за 3 броска будут отклонены только 4 раза (т. Е. Потратить более 12 бросков) в 0.390625% случаев.
Темыр

@Taemyr 5-битное число может представлять 32 различных значения, что позволяет вам представлять один кубик (потому что два кубика имеют 36 возможностей). Таким образом, приемлемы только 6/32 значения с процентом брака 27/32 = 84%
Эмануэле Паолини

@Taemyr: коэффициент отклонения на бросков означает, что в среднем каждая партия из бросков отклоняется с вероятностью . Таким образом, в среднем каждый бросок отклоняется с одинаковой скоростью (не зависящей от ). н н р р нrnnrrn
Эмануэле Паолини

Да. И используя метод FrankW, который имеет коэффициент отклонения 25% для партии из 3 бросков, вы имели бы вероятность 1-0.00390625 принять не позднее, чем 4-я партия.
Taemyr

29

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

  • Переверните монету 3 раза и интерпретируйте каждый бросок как бит (0 или 1).
  • Объединить 3 бита, задав двоичное число в .[0,7]
  • Если число в , возьмите его как бросок кубика.[1,6]
  • В противном случае, т.е. если результат равен или , повторите сальто.707

Поскольку из возможных результатов приводит к завершению в каждом наборе, вероятность того, что для получения броска кубика потребуется более наборов бросков, составляет . Следовательно, этот метод эффективен на практике. л(1-668l(168)l=14l

Улучшения:

Ответ @ Ангела указывает на то, что количество монет в каждом сете, но первый может быть уменьшено с 3 до 2, используя различие между и в качестве первого бита для следующего сета.707

@Emanuele Paolini объясняет, как вы можете уменьшить количество повторных бросков, если вам нужно несколько бросков кубика.


Разве этот метод не даст большую центральную тенденцию, чем истинный d6?
Red_Shadow

3
@Red_Shadow Нет. Обратите внимание, что вы не добавляете броски монет (тогда трех будет недостаточно), но выбираете каждый бит в битном двоичном числе по монетам. Таким образом, вы выбираете равномерно из и отклоняете числа не из целевого интервала; это может привести только к равномерному распределению на целевом интервале. [ 0..2 k - 1 ]k[0..2k1]
Рафаэль

Если вы искусны с отклоненным диапазоном, в этом случае на самом деле легко использовать это, чтобы уменьшить количество необходимых бросков монет в случае отклонения.
Угу Мыс

@MooingDuck вы можете решить, следует ли отбрасывать ваш результат после 2 бросков: если он равен 0,0, 0,1 или 1,0, то снова бросаем последний бит, в противном случае начинаем заново
безумный урод

1
k

7

Альтернативой выборке отбраковки (как описано в ответе FrankW ) является использование алгоритма масштабирования, который учитывает ответ из [7,8], как если бы это был другой бросок монеты.

На mathforum.org есть очень подробное объяснение , включая алгоритм ( NextBit()он будет подбрасывать вашу честную монету).

Случай для бросания кости с честной монетой (выборка 2 → 6) проще, чем общий алгоритм. Вы просто берете неудачу (7 или 8) как еще один вход для монет и выполняете еще два броска.


2

Другой подход к моделированию броска dN с использованием dM (в случае конкретного вопроса, задаваемого d6 с использованием d2) состоит в разбиении интервала [0, 1) на N равных интервалов длины 1 / N, [0, 1 / N), [1 / N, 2 / N), ..., [(N-1) / N, N).

Используйте dM для генерирования дроби base-M, 0.bbbb ..., в [0, 1). Если это попадает в [(i-1) / N, i / N), возьмите i в качестве броска dN. Обратите внимание, что вам нужно только сгенерировать достаточное количество базовых M цифр дроби, чтобы определить, в каком интервале он находится.


Условие завершения должно быть уточнено. Если я подброшу монету, как только получу двоичную дробь 0,0 или 0,1 (то есть 1/2), оба из которых попадают в интервал (соответствующий 0 и 3 соответственно в данном случае). Вы должны рассматривать сгенерированную дробь как диапазон, и вы останавливаетесь, когда весь диапазон находится в пределах одного интервала. Я уверен, что это то, что вы хотели, но я не думаю, что это понятно.
Ричи

1

Возможно более простое объяснение улучшенной выборки отклонения.

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

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

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

На самом деле это означает, что один бит информации был произведен с первыми тремя сальто, которые не нужно было производить. Точнее, вам нужно всего лишь дважды перевернуть монету, чтобы узнать, будет ли текущий набор бросков успешным.

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

Это может быть достигнуто, по меньшей мере, двумя способами или, точнее, в двух разных интерпретациях сальто. Там могут быть другие.

Группировка результатов в парах

Идея состоит в том, чтобы рассмотреть только три значения (1,2), (3,4) и (5,6), представленные любыми тремя конфигурациями с двумя переворотами, скажем, TT, TH, HT. Затем вы можете применить выборку отклонения с двойным переворотом, повторяя каждый раз, когда вы получаете конфигурацию сбоя HH.

Как только вы получите одну из трех успешных конфигураций, вы просто переворачиваете монету еще раз, чтобы решить, следует ли вам брать первое или второе значение соответствующей пары.

Раннее обнаружение отказа от переворота

Идея состоит в том, чтобы использовать немного другое чтение конфигурации с тремя переворотами. Если Head и Tail интерпретируются как 1 и 0, то конфигурация должна соответствовать двоичной интерпретации плюс один. То есть TTT (то есть 000) соответствует 1, HTH (то есть 101) соответствует 6, HHT (то есть 110) и HHH (то есть 111) соответствует 7 и 8, или что-либо вне [1,6].

Затем мы знаем, что сальто успешно или неудачно только с первыми двумя сальто. Если они производят HH, сальто не срабатывает независимо от последнего сальто. Так что это можно пропустить.

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

Например, для игры в кости с 10 гранями вам нужен в принципе набор из 4 флипов, с 6 конфигурациями, соответствующими неудаче. Хитрость заключается в том, чтобы иметь все конфигурации ошибок на верхнем конце последовательности двоичных значений следующим образом:

TTTT  0000   1
HTTT  1000   9
HTTH  1001  10
HTHT  1001  11
HTHH  1011  12
HHTT  1100  13
HHHH  1111  16

Успешные конфигурации соответствуют диапазону [1, 10] и сбои в диапазоне [11,16].

Затем вы терпите неудачу, когда первые два броска дают HH, или когда первые три броска дают HTH, без необходимости даже пытаться пропустить броски набора.

Если вы не терпите неудачу, вы просто прекращаете набор сальто.


1

Есть два известных подхода к этому. Одним из них является "выборка отклонения". Например, используйте три бита, чтобы выбрать одно из шести значений, повторив попытку для двух дополнительных выборок. Или используйте 14 бит (8192 значения), чтобы выбрать 5 значений от 1 до 6 (7776 возможностей), повторив попытку в 13 из 256 случаев.

Другой использует декомпрессионную часть алгоритма сжатия / декомпрессии: при арифметическом кодировании последовательность случайных значений от 1 до 6 может быть сжата практически без избыточности. Произведите сжатую последовательность случайным образом и распакуйте ее. Это намного сложнее, но практически не потребует дополнительных случайных чисел.


0

Извините заранее, если объяснение лишнее. Я не был уверен в том, как много деталей нужно описать или насколько легко понять концепцию.

Скажем, у вас есть три монеты (справедливые монеты). Если вы постепенно назначаете значение каждой стороне каждой монеты, у вас будет шесть значений.

Вот так: на первой монете головы 1, а хвостов 2. На второй монете головы 3, хвостов 4. На третьей монете головы 5, хвостов 6.

При подбрасывании монет у вас останется набор из трех чисел, ваш текущий набор. Теперь ваш текущий набор станет вашим предыдущим набором, и вы повторите процедуру, чтобы получить новый набор из трех чисел.

Продолжайте делать это, пока один и только один номер не совпадет с вашим текущим набором. Это твой номер.

Так что, если у вас есть [головы, хвосты, головы] для текущего набора, это будет [1, 4, 5]. Теперь вы переворачиваете их снова, и ваш текущий набор равен [2, 4, 5]. Два матча. Не хорошо. Попробуйте снова. Вы получаете [2, 3, 6]. Только один матч. Ваш номер два.

Будет равный шанс, что появится любое заданное число, но оно не особенно экономически выгодно, учитывая, что есть только изменение 3/32, что любая данная пара наборов будет успешной (только одно совпадение). Таким образом, в среднем алгоритм должен был бы повторяться около десяти раз. Кроме того, нелегко обобщить куб с нечетным номером.

По крайней мере, может быть, это пища для размышлений. Очень интересный вопрос


4
lognn12n2n/2n

0

Я перевернул бы монету три раза и интерпретировал бы результат как двоичное число, отклоняя результаты вне диапазона.

Например, пусть головы равны 1, а хвосты равны 0. Если вы перевернули его три раза и получили головы, хвосты, головы, у вас будет двоичный код 101, который равен 5 в десятичной дроби. HHT = 110b = 6. TTT = 000b = 0 и HHH = 111b = 7, оба из которых находятся за пределами диапазона и будут отклонены, и вы должны были бы повторить для всех цифр.


1
Это просто ответ Фрэнка.
Рафаэль

2
@Raphael На самом деле, строгое подмножество ответа Фрэнка, так как Фрэнк обращается к ожидаемому времени выполнения.
Дэвид Ричерби

0

К сожалению, нельзя (точно) симулировать (честный) кубик, используя (последовательности) честных монет.

62

Но это можно сделать с помощью справедливой «тройной монеты» (если можно использовать такой термин). Смысл монеты с 3 исходами. И простая 2-монета, так что совместное пространство этих 2-х монет точно соответствует пространству событий кубика.

Отказ от выборки (как уже упоминалось в некоторых ответах) может дать приблизительное моделирование. Но он все равно будет иметь количество ошибок или несовпадений вероятностей (за конечное время). Таким образом, если кто-то действительно хочет сопоставить пространства событий этих двух систем, будут случаи, когда он не будет работать.

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


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Жиль "ТАК - перестань быть злым"

@ Жиль, слишком плохой отрицательный голос все еще здесь, несмотря на все объяснения и беседы (относительно правильности), которые продолжались: p
Никос М.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.