これは、Glassdoorで見つけた質問です。コインを使用して、等しい確率で7つの整数をどのように生成しますか?
基本的に、あなたは公平かもしれないし、そうでないかもしれないコインを持っています、そしてこれはあなたが持っている唯一の乱数生成プロセスであるので、これらの各整数を得る確率が1から7までの整数を出力する乱数ジェネレータを考え出します1/7です。
データ生成プロセスの効率が重要です。
これは、Glassdoorで見つけた質問です。コインを使用して、等しい確率で7つの整数をどのように生成しますか?
基本的に、あなたは公平かもしれないし、そうでないかもしれないコインを持っています、そしてこれはあなたが持っている唯一の乱数生成プロセスであるので、これらの各整数を得る確率が1から7までの整数を出力する乱数ジェネレータを考え出します1/7です。
データ生成プロセスの効率が重要です。
回答:
コインを2回裏返します。着陸したHH
場合TT
、または無視して、もう一度2回裏返します。
さて、コインが来るの等しい確率があるHT
かをTH
。それが現れたらHT
、これを呼んでくださいH1
。それが現れたらTH
、これを呼んでくださいT1
。
取得を続けるH1
かT1
、3つ連続するまで。これらの3つの結果は、以下の表に基づいた数値を提供します。
H1 H1 H1 -> 1
H1 H1 T1 -> 2
H1 T1 H1 -> 3
H1 T1 T1 -> 4
T1 H1 H1 -> 5
T1 H1 T1 -> 6
T1 T1 H1 -> 7
T1 T1 T1 -> [Throw out all results so far and repeat]
処理中に多くの無駄なスローが発生しますが、これは完全にうまく機能すると主張します!
と仮定します。
ステップ1: 。コインを5回投げます。
結果が
1、を返して停止します。
2、を返し、停止します。
3、を返し、停止します。
4、を返し停止します。
5、を返し、停止します。
6、を返し、停止します。
7、を返し、停止します。
ステップ2: 。結果が上記のいずれでもない場合は、手順1を繰り返します。
の値に関係なく、上記の7つの結果はそれぞれ確率であり、コイン投げの予想数はであることに注意してください。。トッサーはの値を知る必要はありません(およびを除く)。7つの整数が、実験の終了時に等しく返される可能性が高いことが保証されています(確率終了することが保証されています)。Q = P 3(1 - P )2 5 pp≠0p≠11
他の回答で説明されている方法のいくつかは、「ターン」でコインのシーケンスを投げるスキームを使用し、結果に応じて1または7の間の数字を選択するか、ターンを捨てて再び投げます。
秘Theは、可能性の拡大において、同じ確率で7つの倍数の結果を見つけ、それらを互いに照合することです。
結果の総数は7の倍数ではないため、数に割り当てることができないいくつかの結果があり、結果を破棄してやり直す必要がある可能性があります。
直観的には、サイコロを7回振るのは非常に興味深いと言えます。可能性のうち2つを捨てるだけです。つまり、7回のヘッドと0回のヘッドです。
他のすべての可能性については、常に同じ数の頭を持つ7の倍数のケースがあります。つまり、1頭の7ケース、2頭の21ケース、3頭の35ケース、4頭の35ケース、5頭の21ケース、6頭の7ケースです。
したがって、数値を計算すると(0頭と7頭を破棄)
ベルヌーイ変数(値0又は1)を分散し、Xモジュロ7は、7つの可能な結果を有する均一な変数です。
問題は、1ターンあたりの最適なロール数です。1ターンあたりのサイコロの数を増やすとコストがかかりますが、再度サイコロを振る確率が減ります。
以下の画像は、1ターンあたりの最初の数回のコインフリップの手動計算を示しています。(おそらく分析ソリューションがあるかもしれませんが、コインフリップが7回あるシステムが、必要なコインフリップの数に対する期待値に関して最良の方法を提供すると言っても安全だと思います)
# plot an empty canvas
plot(-100,-100,
xlab="flips per turn",
ylab="E(total flips)",
ylim=c(7,400),xlim=c(0,20),log="y")
title("expectation value for total number of coin flips
(number of turns times flips per turn)")
# loop 1
# different values p from fair to very unfair
# since this is symmetric only from 0 to 0.5 is necessary
# loop 2
# different values for number of flips per turn
# we can only use a multiple of 7 to assign
# so the modulus will have to be discarded
# from this we can calculate the probability that the turn succeeds
# the expected number of flips is
# the flips per turn
# divided by
# the probability for the turn to succeed
for (p in c(0.5,0.2,0.1,0.05)) {
Ecoins <- rep(0,16)
for (dr in (5:20)){
Pdiscards = 0
for (i in c(0:dr)) {
Pdiscards = Pdiscards + p^(i)*(1-p)^(dr-i) * (choose(dr,i) %% 7)
}
Ecoins[dr-4] = dr/(1-Pdiscards)
}
lines(5:20, Ecoins)
points(5:20, Ecoins, pch=21, col="black", bg="white", cex=0.5)
text(5, Ecoins[1], paste0("p = ",p), pos=2)
}
注:フリップ数の期待値に対する以下の計算は、公正なコインに対するものであり、異なるに対してこれを行うのは混乱になりますが、原則は同じままです(ただし、ケースが必要です)
(の式の代わりに)ケースを選択して、より早く停止できるようにする必要があります。
5つのコインフリップを使用して、6つの異なる順序のない頭と尾のセットを用意しています。
1 + 5 + 10 + 10 + 5 + 1順序付きセット
そして、10個のケースを持つグループ(つまり、2つの頭を持つグループまたは2つの尾を持つグループ)を使用して、(同じ確率で)数を選択できます。これは、2 ^ 5 = 32の場合のうち14の場合に発生します。これにより、次のことができます。
1 + 5 + 3 + 3 + 5 + 1順序セット
余分な(6番目の)コインフリップにより、7つの異なる順序のない頭と尾のセットがあります。
1 + 6 + 8 + 6 + 8 + 6 + 1順序付きセット
そして、8つのケースを持つグループ(つまり、3つの頭を持つグループまたは3つの尾を持つグループ)を使用して(等しい確率で)数を選択できます。これは、2 *(2 ^ 5-14)= 36ケースのうち14ケースで発生します。これにより、次のことができます。
1 + 6 + 1 + 6 + 1 + 6 + 1順序セット
別の(7番目の)余分なコインフリップを使用して、8つの可能な異なる順序のない頭と尾のセットを用意しています。
1 + 7 + 7 + 7 + 7 + 7 + 7 + 1順序付きセット
そして、7つのケース(すべてのテールとすべてのヘッドのケースを除くすべて)を持つグループを使用して、(同じ確率で)数を選択できます。これは、44件中42件で発生しています。これにより、次のことができます。
1 + 0 + 0 + 0 + 0 + 0 + 0 + 1順序付きセット
(これを継続することもできますが、49番目のステップでのみこれが有利になります)
したがって、数字を選択する確率
これにより、1ターンのフリップ数の期待値が、成功とp = 0.5を条件としています。
フリップの合計数の期待値(成功するまで)は、p = 0.5を条件として、次のようになります。
NcAdamsの答えは、この停止ルール戦略のバリエーションを使用しています(毎回2つの新しいコインフリップを思い付きます)が、すべてのフリップを最適に選択しているわけではありません。
Clidの答えも同様かもしれませんが、2つのコインフリップごとに数字を選択するという不均一な選択ルールがあるかもしれませんが、必ずしも同じ確率ではありません(後のコインフリップ中に修復される矛盾)
同様の原理を使用する他の方法は、NcAdamsとAdamOによるものです。
原則は次のとおりです。1〜7の間の数の決定は、一定数の頭と尾の後に行われます。のフリップの後、数字につながる各決定について、数字(同じ数の頭と尾ですが、順序が異なる)につながる同様の確率のある決定があります。頭と尾のいくつかのシリーズは、最初からやり直す決定につながる可能性があります。
そのようなタイプの方法では、ここに配置されたものが最も効率的です(可能な限り早く決定を下すためです(回目のフリップの後、頭と尾の7つの等しい確率シーケンスの可能性があると、番号を決定するためにそれらを使用し、それらのケースのいずれかが発生した場合、さらにフリップする必要はありません)。
これは、以下の画像とシミュレーションで実証されています。
#### mathematical part #####
set.seed(1)
#plotting this method
p <- seq(0.001,0.999,0.001)
tot <- (5*7*(p^2*(1-p)^3+p^3*(1-p)^2)+
6*7*(p^2*(1-p)^4+p^4*(1-p)^2)+
7*7*(p^1*(1-p)^6+p^2*(1-p)^5+p^3*(1-p)^4+p^4*(1-p)^3+p^5*(1-p)^2+p^6*(1-p)^1)+
7*1*(0+p^7+(1-p)^7) )/
(1-p^7-(1-p)^7)
plot(p,tot,type="l",log="y",
xlab="p",
ylab="expactation value number of flips"
)
#plotting method by AdamO
tot <- (7*(p^20-20*p^19+189*p^18-1121*p^17+4674*p^16-14536*p^15+34900*p^14-66014*p^13+99426*p^12-119573*p^11+114257*p^10-85514*p^9+48750*p^8-20100*p^7+5400*p^6-720*p^5)+6*
(-7*p^21+140*p^20-1323*p^19+7847*p^18-32718*p^17+101752*p^16-244307*p^15+462196*p^14-696612*p^13+839468*p^12-806260*p^11+610617*p^10-357343*p^9+156100*p^8-47950*p^7+9240*p^6-840*p^5)+5*
(21*p^22-420*p^21+3969*p^20-23541*p^19+98154*p^18-305277*p^17+733257*p^16-1389066*p^15+2100987*p^14-2552529*p^13+2493624*p^12-1952475*p^11+1215900*p^10-594216*p^9+222600*p^8-61068*p^7+11088*p^6-1008*p^5)+4*(-
35*p^23+700*p^22-6615*p^21+39235*p^20-163625*p^19+509425*p^18-1227345*p^17+2341955*p^16-3595725*p^15+4493195*p^14-4609675*p^13+3907820*p^12-2745610*p^11+1592640*p^10-750855*p^9+278250*p^8-76335*p^7+13860*p^6-
1260*p^5)+3*(35*p^24-700*p^23+6615*p^22-39270*p^21+164325*p^20-515935*p^19+1264725*p^18-2490320*p^17+4027555*p^16-5447470*p^15+6245645*p^14-6113275*p^13+5102720*p^12-3597370*p^11+2105880*p^10-999180*p^9+371000
*p^8-101780*p^7+18480*p^6-1680*p^5)+2*(-21*p^25+420*p^24-3990*p^23+24024*p^22-103362*p^21+340221*p^20-896679*p^19+1954827*p^18-3604755*p^17+5695179*p^16-7742301*p^15+9038379*p^14-9009357*p^13+7608720*p^12-
5390385*p^11+3158820*p^10-1498770*p^9+556500*p^8-152670*p^7+27720*p^6-2520*p^5))/(7*p^27-147*p^26+1505*p^25-10073*p^24+49777*p^23-193781*p^22+616532*p^21-1636082*p^20+3660762*p^19-6946380*p^18+11213888*p^17-
15426950*p^16+18087244*p^15-18037012*p^14+15224160*p^13-10781610*p^12+6317640*p^11-2997540*p^10+1113000*p^9-305340*p^8+55440*p^7-5040*p^6)
lines(p,tot,col=2,lty=2)
#plotting method by NcAdam
lines(p,3*8/7/(p*(1-p)),col=3,lty=2)
legend(0.2,500,
c("this method calculation","AdamO","NcAdams","this method simulation"),
lty=c(1,2,2,0),pch=c(NA,NA,NA,1),col=c(1,2,3,1))
##### simulation part ######
#creating decision table
mat<-matrix(as.numeric(intToBits(c(0:(2^5-1)))),2^5,byrow=1)[,c(1:12)]
colnames(mat) <- c("b1","b2","b3","b4","b5","b6","b7","sum5","sum6","sum7","decision","exit")
# first 5 rolls
mat[,8] <- sapply(c(1:2^5), FUN = function(x) {sum(mat[x,1:5])})
mat[which((mat[,8]==2)&(mat[,11]==0))[1:7],12] = rep(5,7) # we can stop for 7 cases with 2 heads
mat[which((mat[,8]==2)&(mat[,11]==0))[1:7],11] = c(1:7)
mat[which((mat[,8]==3)&(mat[,11]==0))[1:7],12] = rep(5,7) # we can stop for 7 cases with 3 heads
mat[which((mat[,8]==3)&(mat[,11]==0))[1:7],11] = c(1:7)
# extra 6th roll
mat <- rbind(mat,mat)
mat[c(33:64),6] <- rep(1,32)
mat[,9] <- sapply(c(1:2^6), FUN = function(x) {sum(mat[x,1:6])})
mat[which((mat[,9]==2)&(mat[,11]==0))[1:7],12] = rep(6,7) # we can stop for 7 cases with 2 heads
mat[which((mat[,9]==2)&(mat[,11]==0))[1:7],11] = c(1:7)
mat[which((mat[,9]==4)&(mat[,11]==0))[1:7],12] = rep(6,7) # we can stop for 7 cases with 4 heads
mat[which((mat[,9]==4)&(mat[,11]==0))[1:7],11] = c(1:7)
# extra 7th roll
mat <- rbind(mat,mat)
mat[c(65:128),7] <- rep(1,64)
mat[,10] <- sapply(c(1:2^7), FUN = function(x) {sum(mat[x,1:7])})
for (i in 1:6) {
mat[which((mat[,10]==i)&(mat[,11]==0))[1:7],12] = rep(7,7) # we can stop for 7 cases with i heads
mat[which((mat[,10]==i)&(mat[,11]==0))[1:7],11] = c(1:7)
}
mat[1,12] = 7 # when we did not have succes we still need to count the 7 coin tosses
mat[2^7,12] = 7
draws = rep(0,100)
num = rep(0,100)
# plotting simulation
for (p in seq(0.05,0.95,0.05)) {
n <- rep(0,1000)
for (i in 1:1000) {
coinflips <- rbinom(7,1,p) # draw seven numbers
I <- mat[,1:7]-matrix(rep(coinflips,2^7),2^7,byrow=1) == rep(0,7) # compare with the table
Imatch = I[,1]*I[,2]*I[,3]*I[,4]*I[,5]*I[,6]*I[,7] # compare with the table
draws[i] <- mat[which(Imatch==1),11] # result which number
num[i] <- mat[which(Imatch==1),12] # result how long it took
}
Nturn <- mean(num) #how many flips we made
Sturn <- (1000-sum(draws==0))/1000 #how many numbers we got (relatively)
points(p,Nturn/Sturn)
}
より良い比較のためにでスケーリングされた別の画像:
この投稿とコメントで説明されている方法を比較してズームイン
「7番目のステップの条件付きスキップ」は、早期停止ルールで行うことができるわずかな改善です。この場合、6回目のフリップの後、等しい確率を持つグループではないものを選択します。確率が等しい6つのグループと、わずかに異なる確率の1つのグループがあります(この最後のグループでは、頭または尾が6つある場合にもう1回余分に反転する必要があり、頭または尾7つを破棄すると終了します)結局同じ確率で)
StackExchangeStrikeによって書かれました。
ボックスを7つの等面積領域に分割し、各領域に整数のラベルを付けます。各領域に着地する確率が等しくなるように、コインを箱に投げ込みます。
0
であり、2番目の投球がさらに進んだ場合は1
編集:他のユーザーのフィードバックに基づきます。
ここに興味深い考えがあります:
{1,2,3,4,5,6,7}のリストを設定します。リスト内の各要素のコインを順番に投げます。特定の要素に対して頭を上にして着地した場合は、リストから番号を削除します。リストの特定の反復からすべての数値が削除された場合、サンプリングを繰り返します。番号が1つだけになるまでこれを行います。
drop.one <- function(x, p) {
drop <- runif(length(x)) < p
if (all(drop))
return(x)
return(x[!drop])
}
sample.recur <- function(x, p) {
if (length(x) > 1)
return(sample.recur(drop.one(x, p), p))
return(x)
}
# x <- c(1:7,7:1)
x <- 1:7
p <- 0.01
out <- replicate(1e5, sample.recur(x, p))
round(prop.table(table(out)), 2)
ほぼ均一な分布が得られます
> round(prop.table(table(out)), 2)
out
1 2 3 4 5 6 7
0.14 0.14 0.15 0.14 0.14 0.14 0.14
以下は、コイン投げの期待値が NcAdamsからの回答と比較する画像です。
M: matrix(
[(1-p)^7, 0, 0,0,0,0,1,1],
[7* p*(1-p)^6, (1-p)^6, 0,0,0,0,0,0],
[21*p^2*(1-p)^5, 6*p*(1-p)^5, (1-p)^5,0,0,0,0,0],
[35*p^3*(1-p)^4, 15*p^2*(1-p)^4, 5*p*(1-p)^4,(1-p)^4,0,0,0,0],
[35*p^4*(1-p)^3, 20*p^3*(1-p)^3, 10*p^2*(1-p)^3,4*p*(1-p)^3,(1-p)^3,0,0,0],
[21*p^5*(1-p)^2, 15*p^4*(1-p)^2, 10*p^3*(1-p)^2,6*p^2*(1-p)^2,3*p*(1-p)^2,(1-p)^2,0,0],
[7* p^6*(1-p)^1, 6*p^5*(1-p), 5*p^4*(1-p),4*p^3*(1-p),3*p^2*(1-p),2*(1-p)*p,0,0],
[p^7, p^6, p^5,p^4,p^3,p^2,0,0]
);
z: nullspace(M-diagmatrix(8,1));
x : apply (addcol, args (z));
t : [7,6,5,4,3,2,0,0];
plot2d(t.x/x[7],[p,0,1],logy);
# plotting empty canvas
plot(-100,-100,
xlab="p",
ylab="E(total flips)",
ylim=c(10,1000),xlim=c(0,1),log="y")
# plotting simulation
for (p in seq(0.1,0.9,0.05)) {
n <- rep(0,10000)
for (i in 1:10000) {
success = 0
tests = c(1,1,1,1,1,1,1) # start with seven numbers in the set
count = 0
while(success==0) {
for (j in 1:7) {
if (tests[j]==1) {
count = count + 1
if (rbinom(1,1,p) == 1) {
tests[j] <- 0 # elliminate number when we draw heads
}
}
}
if (sum(tests)==1) {
n[i] = count
success = 1 # end when 1 is left over
}
if (sum(tests)==0) {
tests = c(1,1,1,1,1,1,1) # restart when 0 are left over
}
}
}
points(p,mean(n))
}
# plotting formula
p <- seq(0.001,0.999,0.001)
tot <- (7*(p^20-20*p^19+189*p^18-1121*p^17+4674*p^16-14536*p^15+34900*p^14-66014*p^13+99426*p^12-119573*p^11+114257*p^10-85514*p^9+48750*p^8-20100*p^7+5400*p^6-720*p^5)+6*
(-7*p^21+140*p^20-1323*p^19+7847*p^18-32718*p^17+101752*p^16-244307*p^15+462196*p^14-696612*p^13+839468*p^12-806260*p^11+610617*p^10-357343*p^9+156100*p^8-47950*p^7+9240*p^6-840*p^5)+5*
(21*p^22-420*p^21+3969*p^20-23541*p^19+98154*p^18-305277*p^17+733257*p^16-1389066*p^15+2100987*p^14-2552529*p^13+2493624*p^12-1952475*p^11+1215900*p^10-594216*p^9+222600*p^8-61068*p^7+11088*p^6-1008*p^5)+4*(-
35*p^23+700*p^22-6615*p^21+39235*p^20-163625*p^19+509425*p^18-1227345*p^17+2341955*p^16-3595725*p^15+4493195*p^14-4609675*p^13+3907820*p^12-2745610*p^11+1592640*p^10-750855*p^9+278250*p^8-76335*p^7+13860*p^6-
1260*p^5)+3*(35*p^24-700*p^23+6615*p^22-39270*p^21+164325*p^20-515935*p^19+1264725*p^18-2490320*p^17+4027555*p^16-5447470*p^15+6245645*p^14-6113275*p^13+5102720*p^12-3597370*p^11+2105880*p^10-999180*p^9+371000
*p^8-101780*p^7+18480*p^6-1680*p^5)+2*(-21*p^25+420*p^24-3990*p^23+24024*p^22-103362*p^21+340221*p^20-896679*p^19+1954827*p^18-3604755*p^17+5695179*p^16-7742301*p^15+9038379*p^14-9009357*p^13+7608720*p^12-
5390385*p^11+3158820*p^10-1498770*p^9+556500*p^8-152670*p^7+27720*p^6-2520*p^5))/(7*p^27-147*p^26+1505*p^25-10073*p^24+49777*p^23-193781*p^22+616532*p^21-1636082*p^20+3660762*p^19-6946380*p^18+11213888*p^17-
15426950*p^16+18087244*p^15-18037012*p^14+15224160*p^13-10781610*p^12+6317640*p^11-2997540*p^10+1113000*p^9-305340*p^8+55440*p^7-5040*p^6)
lines(p,tot)
#plotting comparison with alternative method
lines(p,3*8/7/(p*(1-p)),lty=2)
legend(0.2,500,
c("simulation","calculation","comparison"),
lty=c(0,1,2),pch=c(1,NA,NA))
p <- 0.99
、私は出力を得る0.89 0.02 0.02 0.02 0.02 0.02 0.02
質問は少し曖昧で、「等しい確率で7以下のランダムな整数を生成する」か、「等しい確率で7つのランダムな整数を生成する」かを尋ねますか?-しかし、整数の空間は何ですか?!?
前者であると仮定しますが、その問題が解決されれば、後者のケースにも同じロジックを適用できます。
バイアスコインを使用すると、次の手順に従って公平なコインを生成できます。https : //en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin
7以下の数字は、3桁の{0,1}桁の2進数で記述できます。そのため、上記の手順を3回実行し、生成された2進数を10進数に戻すだけです。
フリップを無駄にしないソリューションは、非常に偏りのあるコインに大いに役立ちます。
このアルゴリズムの欠点は(少なくとも書かれているように)、任意精度の演算を使用していることです。実際には、整数オーバーフローまでこれを使用し、それを捨てて最初からやり直します。
また、バイアスが何であるかを知る必要があります...たとえば、ほとんどの物理現象のように温度に依存する場合はそうではありません。
頭のチャンスは、例えば、30%であると仮定します。
[1, 8)
。[1, 3.1)
です。それ以外の場合は、適切な70%を使用するため、新しい範囲は[3.1, 8)
です。完全なコード:
#!/usr/bin/env python3
from fractions import Fraction
from collections import Counter
from random import randrange
BIAS = Fraction(3, 10)
STAT_COUNT = 100000
calls = 0
def biased_rand():
global calls
calls += 1
return randrange(BIAS.denominator) < BIAS.numerator
def can_generate_multiple(start, stop):
if stop.denominator == 1:
# half-open range
stop = stop.numerator - 1
else:
stop = int(stop)
start = int(start)
return start != stop
def unbiased_rand(start, stop):
if start < 0:
# negative numbers round wrong
return start + unbiased_rand(0, stop - start)
assert isinstance(start, int) and start >= 0
assert isinstance(stop, int) and stop >= start
start = Fraction(start)
stop = Fraction(stop)
while can_generate_multiple(start, stop):
if biased_rand():
old_diff = stop - start
diff = old_diff * BIAS
stop = start + diff
else:
old_diff = stop - start
diff = old_diff * (1 - BIAS)
start = stop - diff
return int(start)
def stats(f, *args, **kwargs):
c = Counter()
for _ in range(STAT_COUNT):
c[f(*args, **kwargs)] += 1
print('stats for %s:' % f.__qualname__)
for k, v in sorted(c.items()):
percent = v * 100 / STAT_COUNT
print(' %s: %f%%' % (k, percent))
def main():
#stats(biased_rand)
stats(unbiased_rand, 1, 7+1)
print('used %f calls at bias %s' % (calls/STAT_COUNT, BIAS))
if __name__ == '__main__':
main()
diff *= 7
ます...実際、各試行に同じベースを使用する必要は特にありません。
NcAdamsの回答のプロセスを使用して、(おそらく)不公平なコインをまず公正なコインに変えます。
コインを2回裏返します。着陸した
HH
場合TT
、または無視して、もう一度2回裏返します。さて、コインが来るの等しい確率がある
HT
かをTH
。それが現れたらHT
、これを呼んでくださいH1
。それが現れたらTH
、これを呼んでくださいT1
。
H1
T1
0.
H1 H1 T1
AdamOの答えに触発されて、バイアスを回避するPythonソリューションを以下に示します。
def roll(p, n):
remaining = range(1,n+1)
flips = 0
while len(remaining) > 1:
round_winners = [c for c in remaining if random.choices(['H','T'], [p, 1.0-p]) == ['H']]
flips += len(remaining)
if len(round_winners) > 0:
remaining = round_winners
p = 1.0 - p
return remaining[0], flips
主な変更点は2つあります。主な変更点は、ラウンドですべての数字が破棄された場合、ラウンドを繰り返すことです。また、毎回、ヘッドとテールのどちらを選択するかを選択します。これにより、p = 0.999の場合、pが0または1に近い場合に必要なフリップの数が〜70%削減されます。
フリップするたびに、各フリップの結果のマッピングを変更することが許可されているようです。したがって、便宜上、最初の7つの正の整数を使用して、次の順序を指定します。
等
無駄なフリップの数はここで傾向があります