Disegna numeri interi in modo indipendente e uniforme a caso da 1 a


18

Vorrei disegnare numeri interi da 1 a qualche specifica lanciando un certo numero di dadi a sei facce giusti (d6). Una buona risposta spiegherà perché il suo metodo produce numeri interi uniformi e indipendenti .NN

Come esempio illustrativo, sarebbe utile spiegare come funziona una soluzione per il caso di .N = 150N=150

Inoltre, desidero che la procedura sia il più efficiente possibile: tira il numero minimo di d6 in media per ogni numero generato.

Sono ammesse conversioni dal senario al decimale.


Questa domanda è stata ispirata da questo thread Meta .

Risposte:


12

L'insieme Ω ( d , n )Ω(d,n) di risultati identificabili distinti in nn tiri indipendenti di un dado con d = 6d=6 facce ha d ndn elementi. Quando il dado è giusto, ciò significa che ogni risultato di un tiro ha probabilità 1 / d1/d e l'indipendenza significa che ciascuno di questi risultati avrà quindi probabilità ( 1 / d ) n :(1/d)n: cioè, hanno una distribuzione uniforme P d , n .Pd,n.

Supponiamo che tu abbia escogitato una procedura tt che determini mm esiti di un dado con lato c ( = 150 )c(=150) - cioè un elemento di Ω ( c , m ) -Ω(c,m) oppure segnala un fallimento (il che significa che dovrai ripetere per ottenere un risultato). Questo è,

t : Ω ( d , n ) Ω ( c , m ) { Errore } .

t:Ω(d,n)Ω(c,m){Failure}.

Sia FF la probabilità traduca in un fallimento e si noti che è un multiplo integrale di diciamottFFdn,dn,

F=Pr(t(ω)=Failure)=NFdn.

F=Pr(t(ω)=Failure)=NFdn.

(Per riferimento futuro, si noti che il numero previsto di volte che deve essere invocato prima di non fallire è )tt1/(1F).1/(1F).

Il requisito che questi risultati in siano uniformi e indipendenti condizionale sulla non denunciare i mezzi di guasto che conserve probabilità, nel senso che per ogni eventoΩ(c,m)Ω(c,m)ttttAΩ(c,m),AΩ(c,m),

Pd,n(tA)1F=Pc,m(A)

Pd,n(tA)1F=Pc,m(A)(1)

dove

t(A)={ωΩt(ω)A}

t(A)={ωΩt(ω)A}

è l'insieme dei tiri di dado che la procedura assegna all'eventottA.A.

Considera un evento atomico , che deve avere probabilitàSia (i tiri di dado associati a ) hanno elementi . diventaA={η}Ω(c,m)A={η}Ω(c,m)cm.cm.t(A)t(A)ηηNηNη(1)(1)

Nηdn1NFdn=Pd,n(tA)1F=Pc,m(A)=cm.

Nηdn1NFdn=Pd,n(tA)1F=Pc,m(A)=cm.(2)

È immediato che siano tutti uguali a un numero interoNηNηN.N. Resta solo da trovare le procedure più efficienti Il numero atteso di non guasti per rullo del lati dado ISt.t.cc

1m(1F).

1m(1F).

Ci sono due implicazioni immediate e ovvie. Uno è che se riusciamo a mantenere piccola man mano che cresce, l'effetto della segnalazione di un errore è asintoticamente zero. L'altro è che per ogni dato (il numero di lanci del dado a per simulare), vogliamo rendere più piccolo possibile.FFmmmmccFF

Diamo un'occhiata più da vicino a cancellando i denominatori:(2)(2)

Ncm=dnNF>0.

Ncm=dnNF>0.

Ciò rende ovvio che in un determinato contesto (determinato da ), viene reso il più piccolo possibile rendendo uguale al multiplo più grande di che è minore o uguale a Possiamo scrivere questo in termini della più grande funzione intera (o "piano") comec,d,n,mc,d,n,mFFdnNFdnNFcmcmdn.dn.

N=dncm.

N=dncm.

Infine, è chiaro che dovrebbe essere il più piccolo possibile per la massima efficienza, perché misura la ridondanza in . In particolare, il numero previsto di rotoli del dado lato necessario per produrre un rotolo del dado lato èNNttddcc

N×nm×11F.

N×nm×11F.

Pertanto, la nostra ricerca di procedure ad alta efficienza dovrebbe concentrarsi sui casi in cui è uguale o appena maggiore di un certo poteredndncm.cm.

L'analisi termina mostrando che per un dato e c'è una sequenza di multipli per i quali questo approccio approssima la perfetta efficienza. Ciò equivale a trovare per cui avvicina a nel limite (garantendo automaticamente ). Una di queste sequenze si ottiene prendendo e determinandoddc,c,(n,m)(n,m)(n,m)(n,m)dn/cm1dn/cm1N=1N=1F0F0n=1,2,3,n=1,2,3,

m=nlogdlogc.

m=nlogdlogc.(3)

La prova è semplice.

Tutto ciò significa che quando siamo disposti a lanciare il dado a faccia di originale un numero sufficientemente grande di volte possiamo aspettarci di simulare quasi risultati di un dado a faccia per tiro . Equivalentemente,ddn,n,logd/logc=logcdlogd/logc=logcdcc

È possibile simulare un gran numero di rotoli indipendenti di senso unico stampo utilizzando un equo sided die utilizzando una media di lancia per risultato dove può essere reso arbitrariamente piccolo scegliendo sufficientemente grande.mmccddlog(c)/log(d)+ϵ=logd(c)+ϵlog(c)/log(d)+ϵ=logd(c)+ϵϵϵmm


Esempi e algoritmi

Nella domanda, e donded=6d=6c=150,c=150,

logd(c)=log(c)log(d)2.796489.

logd(c)=log(c)log(d)2.796489.

Pertanto, la migliore procedura possibile richiederà, in media, almeno tiri di a per simulare ogni risultato.2.7964892.796489d6d150

L'analisi mostra come farlo. Non abbiamo bisogno di ricorrere alla teoria dei numeri per realizzarla: possiamo semplicemente tabulare i poteri e i poteri e confrontarli per trovare dove sono vicini. Questo calcolo della forza bruta fornisce coppiedn=6ndn=6ncm=150mcm=150mcmdncmdn(n,m)(n,m)

(n,m){(3,1),(14,5),}

(n,m){(3,1),(14,5),}

per esempio, corrispondente ai numeri

(6n,150m){(216,150),(78364164096,75937500000),}.

(6n,150m){(216,150),(78364164096,75937500000),}.

Nel primo caso vedrebbe associato dei risultati di tre rotoli al fallimento e gli altri risultati sarebbero ciascuno associato con un singolo risultato di una . tt216150=66216150=66d6150150d150

Nel secondo caso vedrebbe associato dei risultati di 14 rotoli di guasto - circa 3,1% di tutti - e altrimenti sarebbe uscita una sequenza di 5 risultati di uno .tt78364164096759375000007836416409675937500000d6d150

Un semplice algoritmo per implementarett identifica le facce del dado con lato con i numeri e le facce del dado con lato con i numeri Gli tiri del primo dado sono interpretati come un numero -digit nella base Questo viene convertito in un numero in base Se ha al massimo cifre, la sequenza delle ultime cifre è l'output. Altrimenti, restituisce Fallimento invocando se stesso in modo ricorsivo.dd0,1,,d10,1,,d1cc0,1,,c1.0,1,,c1.nnnnd.d.c.c.mmmmtt

Per sequenze molto più lunghe, puoi trovare coppie adatte considerando ogni altro convergente dell'espansione della frazione continua di La teoria delle frazioni continue mostra che questi convergenti si alternano tra essere inferiore a e maggiore di esso (supponendo che non sia già razionale). Scegli quelli che sono meno di(n,m)(n,m)n/mn/mx=log(c)/log(d).x=log(c)/log(d).xxxxx.x.

Nella domanda, i primi pochi di questi convergenti sono

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.

Nell'ultimo caso, una sequenza di 29.036.139 rotoli di a d6produrrà una sequenza di 10.383.070 rotoli di a d150con un tasso di fallimento inferiore a per un'efficienza di distinguibile dal limite asintotico.2×108,2×108,2.796492.79649


2
Incredibile come sempre, sembra quasi che questa risposta sia stata formattata e preparata anche prima che la domanda fosse posta!
Łukasz Grad

1
Grazie, @ ŁukaszGrad. Tuttavia, sono innocente di tali macchinazioni e sono sicuro che i lettori con gli occhi acuti troveranno prove della fretta con cui ho scritto questo, per il quale mi scuso in anticipo.
whuber

Non si dovrebbe anche tenere conto del fatto che quando non è primo, lo spazio campione può essere suddiviso in sottoinsiemi di uguale probabilità? Ad esempio, è possibile utilizzare un d6 come d2 o un d3 e uno spazio campione con 162 elementi - più vicino a 150 di 216 è - è quindi raggiungibile con 4 rotoli, 1d6 + 3d3. (Ciò fornisce gli stessi numero di ddΩ(d,1)Ω(d,1)
giri

@Scortchi Descrivi un'impostazione leggermente diversa in cui si ha una scelta di dadi da usare per simulare i disegni da una distribuzione uniforme. Si applica un'analisi simile: potresti trovarlo divertente eseguirlo.
whuber

7

Nel caso di , tirare tre volte una d6 crea nettamente risultati.N=150N=15063=21663=216

Il risultato desiderato può essere tabulato in questo modo:

  • Registra un d6 tre volte in sequenza. Questo produce risultati . Il risultato è uniforme perché tutti i valori di sono ugualmente probabili (i dadi sono equi e trattiamo ogni lancio come distinto).a,b,ca,b,ca,b,ca,b,c
  • Sottrai 1 da ciascuno.
  • Questo è un numero senario: ogni cifra (valore del luogo) va da 0 a 5 con potenze di 6, quindi puoi scrivere il numero in decimale usando(a1)×62+(b1)×61+(c1)×60
    (a1)×62+(b1)×61+(c1)×60
  • Aggiungi 1
  • Se il risultato supera 150, scartare il risultato e rotolare di nuovo.

La probabilità di mantenere un risultato è . Tutti i tiri sono indipendenti e ripetiamo la procedura fino a un "successo" (un risultato in ), quindi il numero di tentativi di generare 1 pareggio tra 1 e 150 viene distribuito come una variabile casuale geometrica, che ha aspettative . Pertanto, l'utilizzo di questo metodo per generare 1 pareggio richiede di tirare in media tiri di dado (poiché ogni tentativo lancia 3 dadi).p=150216=2536p=150216=25361,2,,1501,2,,150p1=3625p1=36253625×3=4.323625×3=4.32


Ringraziamo @whuber per averlo suggerito in chat.


Credo che il metodo di Henry non produca una distribuzione uniforme. Questo perché il riciclaggio farà sì che vengano privilegiate alcune cifre. Non ne sono completamente sicuro perché non capisco completamente come il riciclaggio debba essere eseguito.
whuber

1
@whuber AH! Capisco la tua preoccupazione ora. Ho appena cercato di spiegare a me stesso il processo e ho capito perché la mia intuizione era imperfetta: la probabilità di lanciare un dado aggiuntivo può cambiare l'assegnazione delle probabilità a numeri decimali e renderlo non uniforme perché non sappiamo in anticipo come molti dadi stiamo lanciando.
Sycorax dice di reintegrare Monica

4

Ecco un'alternativa ancora più semplice alla risposta di Sycorax per il caso in cui . Poiché è possibile eseguire la seguente procedura:N=150N=150150=5×5×6150=5×5×6

Generazione di un numero casuale uniforme da 1 a 150:

  • Fai tre tiri ordinati di 1D6 e come .R1,R2,R3R1,R2,R3
  • Se uno dei primi due tiri è un sei, rilanciarlo fino a quando non è 6.
  • Il numero è un numero uniforme che utilizza la notazione di posizione con una radice di 5-5-6. Pertanto, è possibile calcolare il numero desiderato come: (R1,R2,R3)(R1,R2,R3)X=30(R11)+6(R21)+(R31)+1.
    X=30(R11)+6(R21)+(R31)+1.

Questo metodo può essere generalizzato a più grande , ma diventa un po 'più imbarazzante quando il valore ha uno o più fattori primi maggiori di .NN66


1
Puoi indicare l'efficienza di questo metodo in termini di numero previsto di tiri per sorteggio generati e chiarire perché il risultato è uniforme su 1,2, ...., 150?
Sycorax dice di reintegrare Monica

La probabilità di ottenere un risultato che non richiede il re-roll è , che è lo stesso della risposta. Per capire perché è uniforme, nota che stai effettivamente generando un numero uniforme usando la notazione posizionale con radix 5-5-6 (ovvero, l'ultima cifra è l'unità, la penultima cifra è la "sei" e la terza -last cifra è la "trenta"). 25/3625/36
Ripristina Monica

1
Il metodo è effettivamente solo una leggera variazione del metodo nella tua risposta. Nella tua risposta crei un numero uniforme sulla scala numerica 6-6-6 e poi scarti i valori non validi, mentre nella mia risposta scarti prima i valori non validi per generare un numero sulla scala 5-5-6.
Ripristina Monica

3
+1 In pratica si tratta di un algoritmo accattivante. È interessante e forse suggestivo di un'analisi più ampia, che implementa un automa a stati finiti guidato dai tiri di dado. Ha quattro stati, {Start, A, B, Accept}. Inizia le transizioni verso A dopo aver rotolato 1..5; A passa a B dopo aver rotolato 1..5; e B transizioni per accettare dopo aver fatto rotolare qualcosa. Ogni transizione salva il valore del tiro che lo ha causato, quindi al raggiungimento di Accetta l'output quella sequenza di tre rulli memorizzati e la transizione tornano automaticamente all'inizio.
whuber

4
Rifiuti spesso quanto @Sycorax, ma fai in media meno tiri. Il previsto no. roll per variabile è . 65+65+1=3.465+65+1=3.4
Scortchi - Ripristina Monica

2

Come esempio di un algoritmo per scegliere uniformemente tra valori usando dadi a sei facce, prova questo che usa ogni tiro per moltiplicare i valori disponibili per e rendere ciascuno dei nuovi valori ugualmente probabili:15015066

  • Dopo tiri, hai possibilità, non abbastanza per distinguere valori0011150150
  • Dopo tiro, hai possibilità, non abbastanza per distinguere valori1166150150
  • Dopo tiri, hai possibilità, non abbastanza per distinguere valori223636150150
  • Dopo tiri, hai possibilità, abbastanza per distinguere valori ma con valori rimanenti; la probabilità che ti fermi ora è332162161501506666150216150216
  • Se non ti sei fermato, dopo tiri hai possibilità rimanenti, abbastanza per distinguere valori in due modi ma con valori rimanenti; la probabilità che ti fermi ora è44396396150150969630012963001296
  • Se non ti sei fermato, dopo tiri hai possibilità rimanenti, abbastanza per distinguere valori in tre modi ma con valori rimanenti; la probabilità che ti fermi ora è55576576150150969645077764507776
  • Se non ti sei fermato, dopo tiri hai possibilità rimanenti, abbastanza per distinguere valori in cinque modi ma con valori rimanenti; la probabilità che ti fermi ora è66756756150150667504665675046656

Se ti trovi su uno dei valori rimanenti dopo tiri, allora ti trovi in ​​una situazione simile alla posizione dopo tiro. Quindi puoi continuare allo stesso modo: la probabilità che ti fermi dopo tiri è 0666611772799360279936 , dopo88tiri è15016796161501679616 ecc.

Aggiungi questi e scopri che il numero previsto di rotoli necessari è di circa 3.396143.39614 . Fornisce una selezione uniforme tra 150150 , poiché si seleziona un valore solo in un momento in cui è possibile selezionare ciascuno dei 150150 con uguale probabilità


Sycorax ha chiesto nei commenti un algoritmo più esplicito

  • In primo luogo, lavorerò in base 66 con 150 10 = 410 615010=4106
  • In secondo luogo, anziché i valori target da 1 616 a 410 64106 , ne sottrarrò uno in modo che i valori target siano compresi tra 0 606 e 409 64096
  • Terzo, ogni dado dovrebbe avere valori da 0 606 a 5 656 e il lancio di un dado comporta l'aggiunta di una cifra di 66 cifre sul lato destro del numero generato esistente. I numeri generati possono avere zeri iniziali e il loro numero di cifre è il numero di lanci finora

L'algoritmo è un successivo lancio di dadi:

  • Lancia i primi tre dadi per generare un numero da 000 60006 a 555 65556 . Poiché 1000 6 ÷ 410 6 = 1 6  resto  150 610006÷4106=16 remainder 1506 prendi il valore generato (che è anche il suo residuo sulla divisione per 410 64106 ) se il valore generato è rigorosamente inferiore a 1000 6 - 150 6 = 410 6100061506=4106 e stop;

  • Se continui, tira il quarto dado in modo da aver generato un numero da 4100 641006 a 5555 655556 . Poiché 10000 6 ÷ 410 6 = 12 6  resto  240 6100006÷4106=126 remainder 2406 si prende il resto del valore generato su divisione per 410 64106 se il valore generato è rigorosamente inferiore a 10000 6 - 240 6 = 5320 61000062406=53206 e si ferma;

  • Se continui, tira il quinto dado in modo da aver generato un numero da 53200 6532006 a 55555 6555556 . Poiché 100000 6 ÷ 410 6 = 123 6  resto  330 61000006÷4106=1236 remainder 3306 si prende il resto del valore generato su divisione per 410 64106 se il valore generato è rigorosamente inferiore a 100000 6 - 330 6 = 55230 610000063306=552306 e stop;

  • Se continui, tira il sesto dado in modo da aver generato un numero da 552300 65523006 a 555555 65555556 . Poiché 1000000 6 ÷ 410 6 = 1235 6  resto  10 610000006÷4106=12356 remainder 106 prendi il resto del valore generato su divisione per 410 64106 se il valore generato è rigorosamente inferiore a 1000000 6 - 10 6 = 555550 610000006106=5555506 e stop;

  • eccetera.


(+1) Questa risposta sarebbe più chiara se spiegassi come mappare i risultati, per esempio, da 4d6 o 5d6 a 1,2, ..., 150.
Sycorax dice Reinstate Monica,

@Sycorax - Ora ho fornito una mappatura di base 6
Henry,

1
Le considerazioni sull'entropia indicano che puoi fare sostanzialmente meglio di questo algoritmo. Resta anche da dimostrare che il tuo algoritmo in realtà produce valori distribuiti indipendentemente con distribuzioni uniformi .
whuber

@whuber - Il mio algoritmo produce esattamente un intero da 150 possibilità e lo fa in modo uniforme a condizione che i tiri di dado siano uniformi e indipendenti. Ad ogni passo, se raggiunto, è probabile che sia selezionato ciascuno dei 150 valori. Non produce più valori (a differenza della tua risposta)
Henry

1
Ho capito male cosa intendevi, quindi, scrivendo "l'algoritmo è un successivo lancio di dadi". (Avrei dovuto leggere più attentamente.) Nel fare ciò, mi sembra che il tuo algoritmo non produca una distribuzione uniforme, ma non sono sicuro perché non sono stato in grado di capire a cosa è destinato l'algoritmo generale essere. Sarebbe bello vedere una dimostrazione che produce valori uniformi.
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.