Zestaw Ω ( d , n )Ω(d,n) na różnych zidentyfikowania wyniki w nn niezależne rolki matrycy o d = 6d=6 powierzchniach ma d ndn elementów. Gdy kość jest sprawiedliwa, oznacza to, że każdy wynik jednego rzutu ma prawdopodobieństwo 1 / d,1/d a niezależność oznacza, że każdy z tych wyników będzie miał prawdopodobieństwo ( 1 / d ) n :(1/d)n: to znaczy, że mają one jednolity rozkład P d , n .Pd,n.
Załóżmy, że opracowałeś procedurę t,t która określa mm wyniki matrycy jednostronnej c ( = 150 )c(=150) - to znaczy element Ω ( c , m ) -Ω(c,m) lub w innym przypadku zgłasza awarię (co oznacza, że będziesz musiał powtórzyć w celu uzyskania wyniku). To jest,
t : Ω ( d , n ) → Ω ( c , m ) ∪ { Awaria } .t:Ω(d,n)→Ω(c,m)∪{Failure}.
Niech FF będzie prawdopodobieństwem tt skutkującym awarią i zwróć uwagę, że FF jest , powiedzmy , jakąś integralną wielokrotnością d - nd−n,
F = Pr ( t ( ω ) = Awaria ) = N Fd - n .F=Pr(t(ω)=Failure)=NFd−n.
(W celu odniesienia w przyszłości należy pamiętać, że oczekiwana liczba razy musi zostać wywołana przed niepowodzeniem to )t t1 / ( 1 - F ) .1/(1−F).
Wymaganie, że te wyniki w jest jednolite i niezależne uzależnione od niezgłoszenie środki awaryjnych, które konserwy prawdopodobieństwa w tym sensie, że dla każdego przypadkuΩ ( c , m )Ω(c,m)t tt tA ⊂ Ω ( c , m ) ,A⊂Ω(c,m),
P d , n ( t ∗ A )1 - F =Pc,m(A)Pd,n(t∗A)1−F=Pc,m(A)(1)
gdzie
t ∗ ( A ) = { ω ∈ Ω ∣ t ( ω ) ∈ A }t∗(A)={ω∈Ω∣t(ω)∈A}
jest zestawem rzutów matryc, które procedura przypisuje do zdarzeniat t.A.
Rozważmy zdarzenie atomowe , które musi mieć prawdopodobieństwoNiech (rzuty kostką związane z ) mają elementy . staje sięA = { η } ⊂ Ω ( c , m ) A={η}⊂Ω(c,m)c - m . c−m.t ∗ ( A )t∗(A) η ηN ηNη ( 1 )(1)
N η d - n1−NFd−n=Pd,n(t∗A)1−F=Pc,m(A)=c−m.Nηd−n1−NFd−n=Pd,n(t∗A)1−F=Pc,m(A)=c−m.(2)
Natychmiastowe jest, że są równe jakiejś liczbie całkowitejNηNηN.N. Pozostaje tylko znaleźć najbardziej efektywne procedury Oczekiwana liczba nie-awarii na zwoju kostka ISt.t.cc
1m(1−F).1m(1−F).
Istnieją dwie bezpośrednie i oczywiste implikacje. Jednym z nich jest to, że jeśli możemy utrzymać małą, gdy rośnie, to efekt zgłoszenia awarii jest asymptotycznie zerowy. Drugim jest to, że dla dowolnego danego (liczby rzutów matrycy po stronie do symulacji) chcemy, aby jak najmniejsze.FFmmmmccFF
Przyjrzyjmy się bliżej , usuwając mianowniki:(2)(2)
Ncm=dn−NF>0.Ncm=dn−NF>0.
To pokazuje, że w danym kontekście (określonym przez ), jest tak małe, jak to możliwe, czyniąc równą największej wielokrotności która jest mniejsza lub równa Możemy napisać to w kategoriach największej liczby całkowitej (lub „floor”) asc,d,n,mc,d,n,mFFdn−NFdn−NFcmcmdn.dn.⌊∗⌋⌊∗⌋
N=⌊dncm⌋.N=⌊dncm⌋.
Wreszcie, oczywiste jest, że powinna być jak najmniejsza dla najwyższej wydajności, ponieważ mierzy redundancję w . W szczególności, oczekiwana liczba walców -sided formy potrzebne do wytworzenia jednego zwoju -sided dyszowej mieściNNttddcc
N×nm×11−F.N×nm×11−F.
Dlatego nasze poszukiwania procedur o wysokiej wydajności powinny koncentrować się na przypadkach, w których jest równe lub tylko nieco większe od pewnej mocydndncm.cm.
Analiza kończy się wykazaniem, że dla danych i istnieje ciąg wielokrotności dla którego to podejście jest zbliżone do idealnej wydajności. Sprowadza się to do znalezienia dla którego zbliża się do w limicie (automatycznie gwarantując ). Jedną taką sekwencję uzyskuje się, przyjmując i określającddc,c,(n,m)(n,m)(n,m)(n,m)dn/cm≥1dn/cm≥1N=1N=1F→0F→0n=1,2,3,…n=1,2,3,…
m=⌊nlogdlogc⌋.m=⌊nlogdlogc⌋.(3)
Dowód jest prosty.
To, że wszystkie środki, które, gdy są gotowe do użycia oryginalnego -sided die wystarczająco dużą liczbę można oczekiwać, aby symulować prawie EFEKTY -sided umiera na rolce . Równoważnieddn,n,logd/logc=logcdlogd/logc=logcdcc
Jest możliwe, aby symulować duża ilość niezależnych rolkach o -sided matrycy z wykorzystaniem sprawiedliwego -sided matrycy z wykorzystaniem średnio rzutuje na wynik, gdzie może być dowolnie mały, wybierając odpowiednio duży.mmccddlog(c)/log(d)+ϵ=logd(c)+ϵlog(c)/log(d)+ϵ=logd(c)+ϵϵϵmm
Przykłady i algorytmy
Na pytanie, i skądd=6d=6c=150,c=150,
logd(c)=log(c)log(d)≈2.796489.logd(c)=log(c)log(d)≈2.796489.
Zatem najlepsza możliwa procedura będzie wymagała średnio co najmniej rolek a, aby zasymulować każdy wynik.2.7964892.796489d6
d150
Analiza pokazuje, jak to zrobić. Aby tego dokonać, nie musimy uciekać się do teorii liczb: możemy po prostu zestawić moce d n = 6 ndn=6n i moce c m = 150 mcm=150m i porównać je, aby znaleźć, gdzie c m ≤ d ncm≤dn są bliskie. To obliczenie brutalnej siły daje ( n(n,m)pary , m )
( n , m ) ∈ { ( 3 , 1 ) , ( 14 , 5 ) , … }(n,m)∈{(3,1),(14,5),…}
na przykład odpowiadający liczbom
( 6 n , 150 m ) ∈ { ( 216 , 150 ) , ( 78364164096 , 75937500000 ) , … } .(6n,150m)∈{(216,150),(78364164096,75937500000),…}.
W pierwszym przypadku tt kojarzyłoby 216 - 150 = 66216−150=66 wyników trzech rzutów a d6
do porażki, a pozostałe 150150 wyników byłoby związane z jednym wynikiem a d150
.
W drugim przypadku tt kojarzyłoby 78364164096 - 7593750000078364164096−75937500000 wyników 14 rzutów zd6
awarią - około 3,1% wszystkich - i w innym przypadku dałoby sekwencję 5 wyników ad150
.
Proste do wykonania algorytmu tt etykiet twarze dd -sided umiera z liczb 0 , 1 , ... , d - 10,1,…,d−1 i powierzchniami Cc -sided umiera z liczb 0 , 1 , ... , C - 1. 0,1,…,c−1.nn rzutów z pierwszej kości jest interpretowanych jako liczba n-n cyfrowa w podstawie d . d. To jest konwertowane na liczbę w bazie c . c. Jeśli ma co najwyżej mm cyfr, sekwencja ostatniego mm cyfr, jest to wynik. Inaczej, tt zwraca błąd, wywołując rekurencyjnie.
W przypadku znacznie dłuższych sekwencji można znaleźć odpowiednie pary ( n , m )(n,m) , biorąc pod uwagę każdą inną zbieżną n / mn/m kontynuacji rozszerzenia ułamka x = log ( c ) / log ( d ) . x=log(c)/log(d). Teoria ciągłych ułamków pokazuje, że te zbieżności występują naprzemiennie między byciem mniejszym niż xx i większym niż to (zakładając, że xx nie jest już racjonalny). Wybierz te, które są mniejsze niż x .x.
In the question, the first few such convergents are
3,14/5,165/59,797/285,4301/1538,89043/31841,279235/99852,29036139/10383070….3,14/5,165/59,797/285,4301/1538,89043/31841,279235/99852,29036139/10383070….
In the last case, a sequence of 29,036,139 rolls of a d6
will produce a sequence of 10,383,070 rolls of a d150
with a failure rate less than 2×10−8,2×10−8, for an efficiency of 2.796492.79649--indistinguishable from the asymptotic limit.
For the case of N=150N=150 , rolling a d6 three times distinctly creates 63=21663=216 outcomes.
The desired result can be tabulated in this way:
The probability of keeping a result is p=150216=2536p=150216=2536 . All rolls are independent, and we repeat the procedure until a "success" (a result in 1,2,…,1501,2,…,150 ) so the number of attempts to generate 1 draw between 1 and 150 is distributed as a geometric random variable, which has expectation p−1=3625p−1=3625 . Therefore, using this method to generate 1 draw requires rolling 3625×3=4.323625×3=4.32 dice rolls on average (because each attempt rolls 3 dice).
Credit to @whuber to for suggesting this in chat.
źródło
Here is an even simpler alternative to the answer by Sycorax for the case where N=150N=150 . Since 150=5×5×6150=5×5×6 you can perform the following procedure:
This method can be generalised to larger NN , but it becomes a bit more awkward when the value has one or more prime factors larger than 66 .
źródło
As an illustration of an algorithm to choose uniformly between 150 values using six-sided dice, try this which uses each roll to multiply the available values by 6 and making each of the new values equally likely:
If you are on one of the 6 remaining values after 6 rolls then you are in a similar situation to the position after 1 roll. So you can continue in the same way: the probability you stop after 7 rolls is 0279936, after 8 rolls is 1501679616 etc.
Add these up and you find that the expected number of rolls needed is about 3.39614. It provides a uniform selection from the 150, as you only select a value at a time when you can select each of the 150 with equal probability
Sycorax asked in the comments for a more explicit algorithm
The algorithm is successive rolls of dice:
Roll the first three dice to generate a number from 0006 to 5556. Since 10006÷4106=16 remainder 1506 you take the generated value (which is also its remainder on division by 4106) if the generated value is strictly below 10006−1506=4106 and stop;
If continuing, roll the fourth die so you have now generated a number from 41006 to 55556. Since 100006÷4106=126 remainder 2406 you take the remainder of the generated value on division by 4106 if the generated value is strictly below 100006−2406=53206 and stop;
If continuing, roll the fifth die so you have now generated a number from 532006 to 555556. Since 1000006÷4106=1236 remainder 3306 you take the remainder of the generated value on division by 4106 if the generated value is strictly below 1000006−3306=552306 and stop;
If continuing, roll the sixth die so you have now generated a number from 5523006 to 5555556. Since 10000006÷4106=12356 remainder 106 you take the remainder of the generated value on division by 4106 if the generated value is strictly below 10000006−106=5555506 and stop;
etc.
źródło