Требуется обновление браузера.

Задача о револьвере (теор.вер.)


Просмотров: 4506
29 октября 2016 года

Предупреждение


Данная задача рассматривается как чисто умозрительная, не имеющая под собой реальных прототипов и потому её решение не может быть использовано на практике. Берегите своё здоровье и никогда не участвуйте в безрассудных пари. Единственная приемлемая вероятность в вопросах обеспечения Вашей безопасности - 100%.

Очередная, рассказанная мне задача. Так как запоминал я лишь самую суть ("дано"), то повествовательную нагрузку могу переврать, но концептуально задача выглядит следующим образом.

На заметку
Дан шестизарядный револьвер. В две соседние каморы помещаются патроны, остальные каморы пусты. Далее начинается так называемая "русская рулетка". Первый участник спускает курок, после чего обнаруживается, что ему повезло: патрона в каморе не было. Второй участник должен решить для себя: будет ли он вращать барабан или назовёт слово сразу нажмёт на спусковой крючок сразу. Подразумевается, что игрок не собирается проигрывать.


Демагогия


С галёрки слышится нытьё о применимости понятия вероятности к задаче, которая может и не повторится (какая разница проигравшему, что шанс погибнуть был 1 к 100, если именно этот злосчастный процент реализовался?). Возразить можно следующее: во-первых, теория вероятностей позволяет получить хоть какие-то оценки в условиях дефицита информации (хоть и не гарантирует результатов в данном конкретном случае), во-вторых - это всего-лишь задача, и для устранения дискомфорта, Вы можете переформулировать её соответствующим образом.
Тем не менее, говорить о допустимости применения понятия вероятности, здесь было бы справедливо только для существ, обладающих бесконечным количеством жизней.

Решение


Перед игрой участвующие не имеют никакой информации о каморе, являющейся, в данный момент, продолжением ствола револьвера. Таким образом, в идеальном (с математической точки зрения) случае, первый игрок может вытворять всё что угодно - на его шансы это не повлияет. После первой попытки, начинается процесс идентификации положения барабана. Перед вторым участником стоит нелёгкий выбор: как поступить с имеющейся информации о предыдущем ходе?

Для удобства конкретизируем модель, не снижая её применимость к задаче. Будем считать, что каморы с номерами 1, 2, 3, 4 - пусты, а 5 и 6 - содержат патроны. Предположим, что после выстрела, барабан поворачивается таким образом, что номер каморы возрастает. Ну и
n = ((n-1) mod 6) + 1
: 7-ая камора - это 1-ая, 8-ая - 2-ая и так далее.

Очевидно, что выбрать пустую камору можно с вероятностью 4/6=2/3=0,(6). Так как игра длится до первого выстрела, а пустоту нельзя превратить в патрон, то указанная вероятность сохраняется в течение всей игры (расстановка не меняется).

Интереснее обстоит ситуация с вероятностью выбрать патрон не совершая дополнительных вращений барабана. Очевидно, в этой ситуации картина полностью описывается выбором (неосознанным) первого игрока. Из четырёх имеющихся пустых камор, только камора №4 приведет к печальным последствиям при следующем спуске курка. Соответственно, три из четырёх камор гарантируют второму игроку выживание (если он не будет крутить барабан). Вероятность - 3/4=0,75.

На заметку
Стратегия "не вращать барабан" оканчивается успехом с вероятностью 0,75, в то время, как стратегия "прокрутить барабан" - с вероятностью 0,(6). Таким образом, более выгодно сразу нажать на спусковой крючок.

Весьма не интуитивный ответ. Проверим же его старым излюбленным способом!

Моделирование


Итак, опишем формальную модель эксперимента.

От револьвера нам понадобится:

  • барабан

    123
    Const BRsize%=6
    Global BRptr%
    Dim BR%(BRsize)
    

  • механизм поворота барабана

    1234
    Function BR_next()
    	BRptr=BRptr+1
    	If BRptr>BRsize Then BRptr=1
    End Function
    

  • возможность поместить патрон в камору

    1234
    Function BR_push(v%)
    	BR(BRptr)=v
    	BR_next()
    End Function
    

  • возможность извлечь патрон из каморы (с поворотом барабана или без)

    12345
    Function BR_pop%(rot%=True)
    	Local RVal%=BR(BRptr)
    	If rot Then BR_next()
    	Return RVal
    End Function
    

В рамках эксперимента необходима операция прокрутки барабана на произвольный дискретный угол:

123
Function BR_rotate()
	BRptr=Rand(1,BRsize)
End Function

Установка начального состояния:

Установка барабана в исходное положение
123
Function BR_StartPos()
	BRptr=1
End Function

Загрузка камор
1234567891011
Function BR_init()
	BR_StartPos()
	Local i%
	For i=1 To 4
		BR_push(0)
	Next
	For i=1 To 2
		BR_push(1)
	Next
	BR_StartPos()
End Function

(Для тех, кто ещё не понял - приводится исходный код на языке BlitzBasic.)

Далее формируется алгоритм, работа которого имитирует эксперименты. Степень детализации (близости модели к реальности) выбирается на усмотрение экспериментатора. Проблема в том, что чем больше мысленных преобразований-упрощений будет выполнено, тем больше шансов получить на выходе модель не реальной системы, а того, что мы себе помыслили под таковой. Различные эффекты упустить можно очень просто.

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

Стенд
1234567891011121314151617
Const N%=5000000
Global WithRot%=0
Global WithoutRot%=0
Global Cases%=0

BR_init()

For i%=1 To N
	BR_rotate()
	Local S1%=BR_pop()
	If S1=0
		;
		;сюда надо добавить код
		;		
		Cases=Cases+1
	EndIf
Next

Далее - осторожно смотрим (не вращая барабан, хоть в данной математической модели это и не повлияет на что-либо): что в текущей каморе. Затем вращаем барабан, после чего смотрим: что в выбранной каморе. Такой подход позволяет набрать статистику результатов применения стратегий для каждого фиксированного случая. (Можно было бы произвольным образом выбирать ту или иную стратегию для каждого случая, но это уменьшило бы скорость наполнения статистики, и могло столкнутся - при малом количестве экспериментов - с неудачными случаями для разных стратегий.)

Проверка стратегий
123456
Local S2%=BR_pop(False)
BR_rotate()
Local S3%=BR_pop()
		
If S2=0 Then WithoutRot=WithoutRot+1
If S3=0 Then WithRot=WithRot+1

После прогона нам останется только вычислить отношения:

12
Local Pw#=WithRot/Float(Cases)
Local Pwo#=WithoutRot/Float(Cases)

Итак, я провёл 5 млн. экспериментов, и получил следующие результаты:

  • кол-во игр, продлившихся более одного шага - 3334606, что соответствует вероятности 0.666921 (это число соответствует аналитической вероятности 4/6=2/3=0,(6));
  • кол-во игр, в которых второй игрок удачно применил стратегию "прокрутить барабан", даёт вероятность успеха стратегии 0.666753;
  • кол-во игр, в которых второй игрок удачно применил стратегию "не вращать барабан", даёт вероятность успеха стратегии 0.75026.

На заметку
Модельный эксперимент показал хорошее соответствие результатов аналитическим оценкам. Данное обстоятельство позволяет сделать вывод, что стратегия "не вращать барабан" - с большей вероятностью НЕ приведёт к проигрышу второго игрока при его первом ходе.

Предупреждение


Данная задача рассматривается как чисто умозрительная, не имеющая под собой реальных прототипов и потому её решение не может быть использовано на практике. Берегите своё здоровье и никогда не участвуйте в безрассудных пари. Единственная приемлемая вероятность в вопросах обеспечения Вашей безопасности - 100%.


Запись опубликована в категориях:

ЕГЭ и прочие радости  
 

Комментарии

Инкогнито
  Загружаем captcha