賭ケグルイ(双)のスリーヒットダイスをやってみる

賭ケグルイ(双)の1巻に、スリーヒットダイスという賭けがある。
賭ケグルイ双(漫画)- マンガペディア

聚楽幸子が提案したゲーム。ダイスの123を「DOWN」、456を「UP」として扱い、プレイヤーはDOWNとUPの「連続する3つの出目」を予想してカードに書き、ディーラーが1つのダイスを振り続け、予想した3つの出目が先に出たプレイヤーの勝ちというルール。DOWNは「D」、UPは「U」として表記する。例としてプレイヤー1「UDD」対プレイヤー2「DDU」という予想の勝負であれば、ダイスの出目が「1(D)4(U)5(U)2(D)3(D)」という順番で出現するとなると、523の出目でUDDが成立しプレイヤー1の勝利となる。

DかUが出る確率は各々\frac{1}{2}で、それらが3連になるのはいずれも(\frac{1}{2})^3 だろうと思っていたら、「これは典型的な確率の錯誤」とアメリが言っており、かつ、「連続する3つの出目」のほかにも「出目同士の相性」もあるという二段構えである。

シミュレーションではDUU、DDU、UUD、UDDが早めに出やすく、UDU、DUDがやや遅く、UUU、DDDが最も回数を要する。
f:id:MikuHatsune:20200727162232p:plain

次に、出目で勝てるかどうかを確かめてみる。最速で出目が出るからといって常に勝つとは限らない。例えば、DUUは最速(平均 8回、最頻値 7回)で出るが、UDUに勝てるかどうかは五分五分であるし、DDUに対しては\frac{1}{3} しか勝てない。
UUUはDUUに\frac{1}{8} しか勝てない。というのも、UUUがDUUに勝てるのは最初から3回目までUUUの時だからである。
_8C_2通りの出目の賭け方で、平均的に最も勝てるのはDUUかUDD、ということになる。

 →相手

自分

UUU DUU UDU DDU UUD DUD UDD DDD
UUU 0.000 0.124 0.403 0.299 0.499 0.416 0.397 0.503
DUU 0.876 0.000 0.503 0.333 0.753 0.502 0.500 0.601
UDU 0.597 0.497 0.000 0.375 0.334 0.499 0.497 0.583
DDU 0.701 0.667 0.625 0.000 0.501 0.664 0.248 0.497
UUD 0.501 0.247 0.666 0.499 0.000 0.625 0.665 0.701
DUD 0.584 0.498 0.501 0.336 0.375 0.000 0.500 0.603
UDD 0.603 0.500 0.503 0.752 0.335 0.500 0.000 0.874
DDD 0.497 0.399 0.417 0.503 0.299 0.397 0.126 0.000
ud <- c("U", "D")
ud3 <- apply(expand.grid(ud, ud, ud), 1, paste, collapse="")

n <- 30000
s_generator <- function(size=300){
  tmp <- sample(ud, size=size, replace=TRUE)
  s <- apply(mapply(function(z) tmp[z:(length(tmp)-3+z)], 1:3), 1, paste, collapse="")
  return(s)
}
s0 <- replicate(n, s_generator())

s1 <- mapply(function(z) match(ud3, s0[,z]), seq(ncol(s0)))
m1 <- rowMeans(s1, na.rm=TRUE) + 2
m2 <- apply(s1, 1, median, na.rm=T) + 2

rownames(s1) <- ud3
s2 <- mapply(function(z) table(factor(s1[z,], 1:max(s1, na.rm=TRUE))), seq(ud3))

cols <- jet.colors(length(ud3))
txt <- sprintf("%s (mean=%d, median=%d)", ud3, round(m1), m2)
par(mar=c(5, 5, 2, 2))
matplot(seq(nrow(s2))+2, s2/n, type="l", xlim=c(0, 49), col=cols, lty=1, lwd=4, cex.lab=1.3,
        xlab="最初に3連組み合わせが出現するサイコロ施行回数", ylab="density")
# legend("topright", legend=ud3, pch=15, col=cols, ncol=2, cex=2)
legend("topright", legend=txt, pch=15, col=cols, ncol=1, cex=1.1, y.intersp=1.5)

# 勝負
res <- diag(0, length(ud3))
rownames(res) <- colnames(res) <- ud3
for(i in 1:n){
  m <- match(ud3, s0[,i])
  for(j in seq(ud3)){
    res[j, -j] <- res[j, -j] + (m[j] < m[-j])
  }
}

# 勝率
round(res/n, 3)