Autore Topic: Problema di matematica/statistica: quanti dadi servono per raggiungere X?  (Letto 4186 volte)

Mattia Bulgarelli

  • Facilitatore Globale
  • Membro
  • *****
  • Mattia Bulgarelli
    • Mostra profilo
Ecco il mio problema.

Ho un numero "X" (diciamo, che so: 50, 75, o 100).

Voglio sapere quanti dadi da 6 (o di altro tipo) servono per raggiungere o superare quel numero, e con che probabilità di successo.

Esiste un metodo semplice (per ignoranti di matematica come me) per calcolarlo? Eventualmente anche sfruttando anydice.com, eh!
Co-creatore di Dilemma! - Ninja tra i pirati a INC 2010 - Padre del motto "Basta Chiedere™!"

Mr. Mario

  • Archivista
  • Membro
  • *
  • Mario Bolzoni
    • Mostra profilo
Uhm... non esattamente. O meglio, con anydice è dura lavorare con due variabili (numero dei dadi e probabilità che vuoi raggiungere).

Quello che penso ti possa convenire fare, è scegliere grossomodo la probabilità che vuoi raggiungere, dargli il comando 'output XXd6' guardare con 'At least' la probabilità di raggiungere o superare il tuo numero bersaglio, e aggiustare il numero dei dadi (l'XX qui sopra), finché non si avvicina alla probabilità che volevi raggiungere.

Altrimenti ti posso scrivere una funzione, tipo da mettere in excel, ma a) mi devi spiegare bene cosa vuoi ottenere b) mi serve un po' di tempo.
Sognatore incorreggibile. Segretario dell'Agenzia degli Incantesimi. Seguace di Taku. L'uomo che sussurrava ai mirtilli.

Ma cos'è X per te? Un numero medio che vorresti che uscisse?
Manfredi. Fan Mail: 6 - Fridge-humor Fan-Mail: 1 - Fanmail dell'Illuminata Eccellenza: 1 - Amen: 2 - Punti Sangue: 2 - Morenate : 835

Patrick

  • Membro
  • a.k.a. patmax17
    • Mostra profilo
    • Mio DeviantArt
che odio il calcolo delle probabilità >.<

io ti voglio solo far presente che (a memoria) queste sono tutte domande DIVERSE:
"Quante volte devo tirare un d6 prima di avere una somma di 50?"
"Quante volte devo tirare un d6 per avere il 50% di probabilità di fare 50?"
"Quante volte devo tirare un d6 per avere almeno il 50% di probabilità di fare 50?"
"Qual'è la probabilità di fare almeno 50 tirando un d6 100 volte?"

e ogni domanda usa una variabile aleatoria diversa. Sigh... ç__ç
Patrick Marchiodi, il Valoroso ~ Bravo Organizzatore di CONTM ~ Prima gioca, poi parla. ~ "La cosa più bella di INC11 è stata giocare con persone conosciute da due ore e avere l'impressione di giocare con amici di una vita" - Dario Delfino

Mattia Bulgarelli

  • Facilitatore Globale
  • Membro
  • *****
  • Mattia Bulgarelli
    • Mostra profilo
@Mario & Patrick: avevo un po' il sospetto che fossero due (almeno) variabili... per ora sto usando un metodo "spannometrico" (che mi occuperà MOLTO meno tempo che impostare una faccenda in due variabili): guardo le curve con TOT dadi come sono fatte e mi regolo a spanne.

Per esempio, 29d6 sono centrati sul 102 di risultato, e posso vedere dove cadono i quartili e quanto lunghe sono le "code": http://anydice.com/program/16a8

Me lo farò bastare.

@Manfredi: l'idea era di avere un avanzamento di un "timer", che ad ogni scatto va avanti di uno o due dadi, e misurare quanto è prevedibile il numero di scatti che deve fare per arrivare ad un numero predeterminato (e quanta varianza c'è rispetto a quel numero).

Ma, come detto sopra, si fa prima a guardare un grafico fissando il numero di dadi e il numero "bersaglio", e aggiustando "a occhio".
Co-creatore di Dilemma! - Ninja tra i pirati a INC 2010 - Padre del motto "Basta Chiedere™!"

Seretur

  • Membro
    • Mostra profilo
    • t1.it - magic eternal italiano
Ogni singolo d6 ti da un risultato da 1 a 6 ed è distribuito uniformemente, quindi possiamo dire che ogni dado ti da come media 3.5

Sapendo che la media di ogni dado è 3.5, possiamo facilmente ragionare sul fatto che tirando n dadi, la loro somma totale si avvicinerà a 3.5n, e possiamo ragionevolmente pensare che più n è grande, più il risultato empirico si avvicinerà al valore 3.5n che abbiamo predetto. Quindi una prima stima del numero di dadi possiamo ottenerla facendo 3.5n > X quindi n> X/3.5 Un ragionamento decisamente a tentoni comunque ^^''
Federico Bonadè

Mattia Bulgarelli

  • Facilitatore Globale
  • Membro
  • *****
  • Mattia Bulgarelli
    • Mostra profilo
@Federico: infatti sono partito da lì!

Poi mi sono accorto che meno dadi ci sono, più la campana è ripida e quindi prevedibile.

Per raggiungere un certo numero, conviene aggiungere dei valori fissi più che affidarsi a grandi numeri di dadi (Draghi di D&D 3.X... sto guardando voi... >_< ): è più comodo e non cambia tanto.

Per esempio: http://anydice.com/program/16aa (cliccate su "graph" e sarà evidente la differenza).
Co-creatore di Dilemma! - Ninja tra i pirati a INC 2010 - Padre del motto "Basta Chiedere™!"

Mr. Mario

  • Archivista
  • Membro
  • *
  • Mario Bolzoni
    • Mostra profilo
Beh, sì, questo è normale.

In effetti l'ampiezza della campana vorrebbe scelta in base a quanto vuoi che sia ampio tutto lo spettro dei possibili risultati, e a quanto vuoi che siano probabili le frange.

O ancora meglio, in generale, dovrebbero dipendere da qualcosa di aleatorio come i dadi solo cose che in concreto beneficiano dall'avere un margine di imprevedibilità. Se si parte dai dadi, e poi ci si trova a correggerli perché sono troppo 'selvaggi', forse vale la pena di ripensarci. ;)
Sognatore incorreggibile. Segretario dell'Agenzia degli Incantesimi. Seguace di Taku. L'uomo che sussurrava ai mirtilli.

Mattia, prova a cliccare qui: http://anydice.com/program/16ae

Ti ho preparato una serie di output da 1 a 30 dadi dello stesso tipo.
Cambia il valore di "X" e clicca "Calculate" per cambiare il valore soglia (l'ho impostato a 10 giusto per metterci un valore predefinito)
Cambia il valore di "Y" e clicca "Calculate" per cambiare il numero di facce dei dadi (l'ho impostato a 6 giusto per metterci un valore predefinito).

Per ogni output Anydice ti restituisce la probabilità di ottenere 1 (VERO, cioè il lancio di dado è maggiore del valore soglia) oppure 0 (FALSO, cioè il lancio di dado non è maggiore del valore soglia).

Spero ti sia utile.  ;D
« Ultima modifica: 2012-09-10 22:38:41 da Luca Bonisoli »

Leonardo

  • Membro
    • Mostra profilo
@Manfredi: l'idea era di avere un avanzamento di un "timer", che ad ogni scatto va avanti di uno o due dadi, e misurare quanto è prevedibile il numero di scatti che deve fare per arrivare ad un numero predeterminato (e quanta varianza c'è rispetto a quel numero).

La soluzione matematica esatta del problema posto in questi termini dovrebbe essere abbordabile da un punto di vista logico, un po' meno da quello del calcolo. Richiede comunque di scriversi un programmino perché a mano è materiale per Rain Man. Per il codice e le spiegazioni di come usarlo vedi qui sotto.

Codice: [Seleziona]
D: 6$
S: 30$

G: 0$

for i: 1 thru D step 1 do G: G + 1/D * x^i $

N_Min: entier((S-1)/D)+1 $

N_Max: S $

display(N_Min)$
display(N_Max)$

Media: 0$
Media_Quadrati: 0$
Varianza: 0$
P_T: 0$
G_i: expand(G^(N_Min-1))$
for i:N_Min thru N_Max step 1 do
                           (P_i: 0,
                            for j: 1 thru D step 1 do (P_i: P_i + j/D * coeff(G_i,x,S-D+j-1)),
                            G_i: expand(G_i*G),
                            P_T: P_T + P_i,
                            Media: Media + i*P_i,
                            Media_Quadrati: (Media_Quadrati + i*i*P_i))$

P_T: float(P_T)$
Deviazione_Standard:(sqrt(Media_Quadrati - Media*Media))$
Media: float(Media)$
Deviazione_Standard: float(Deviazione_Standard)$
display(P_T)$
display(Media)$
display(Deviazione_Standard)$

Lo script di cui sopra dovrebbe calcolare media e deviazione standard del numero di lanci di dadi con D facce necessari per superare la soglia S. D e S sono gli unici parametri da variare e compaiono in alto nel codice. Il programma che ho utilizzato si chiama Maxima ed è gratuitamente scaricabile da Sourceforge: http://maxima.sourceforge.net/download.html.
Esiste anche una versione online del programma all'indirizzo http://maxima-online.org/, ma personalmente consiglio di scaricarlo perché l'algoritmo è lento e il calcolo inizia a richiedere 5 minuti circa già per dadi da 10 con soglia 100.

Il programmino indica anche il numero minimo e massimo di dadi necessari a superare la soglia e la probabilità totale, come controllo basilare immediato (se la probabilità totale è diversa da 1 c'è qualche problema...). Spero possa esserti utile.



Per i curiosi e per chi volesse controllare se ho fatto errori concettuali (che mi sarebbe di aiuto visto che si tratta di una eventualità da non trascurare), l'idea alla base del calcolo è la seguente:

Se D è il numero di facce del dado e S la soglia da superare, la variabile aleatoria è il numero di dadi da lanciare per superare S. La chiameremo N (con grande fantasia).
La probabilità di superare S al N-esimo lancio sarà PD,S(N)
L'unica maniera per superare S esattamente al N-esimo lancio è che dopo il lancio del penultimo dado  ((N-1)-esimo) avessimo un punteggio compreso tra S-D e S-1 e che l'ultimo lancio sia pari almeno alla differenza. Indicando con YK(Z) la probabilità di ottenere esattamente Z dalla somma di K dadi:

PD,S(N) =  1/D * YN-1(S-D) + 2/D * YN-1(S-(D-1)) + ... + (D-2)/D * YN-1(S-3) + (D-1)/D * YN-1(S-2) + YN-1(S-1)

A questo punto per calcolare PD,S(N) basta calcolare YK(Z). Esistono diversi modi per farlo e non è detto che siano tutti egualmente efficienti dal punto di vista degli algoritmi utilizzati. Purtroppo non sono un programmatore e quindi ho scelto il metodo più semplice da implementare perché già contenuto nel programma che ho utilizzato. In pratica si sfrutta quella che è chiamata la funzione generatrice della distribuzione di probabilità: tralasciando tutti i dettagli, la probabilità YK(Z) corrisponde al coefficiente che precede il termine di grado Z nell'espansione del polinomio
(1/D * x + 1/D * x^2 + .... + 1/D * x^D)^K

Esempio: se voglio sapere quale è la probabilità di fare 8 lanciando 3 dadi a 4 facce calcolo:
(1/4 * x + 1/4 * x^2 + 1/4 * x^3 + 1/4 * x^4)^3 e vado a leggere il coefficiente di x^8 nel risultato che ottengo.

Una volta che abbiamo PD,S(N) la media si trova sommando N * PD,S(N) su tutti i valori di N e la varianza si trova ricordando che è pari alla media dei quadrati meno il quadrato della media. I valori di N significativi per la somma sono quelli compresi tra la (parte intera di ((S-1)/D)) + 1 (che corrisponde al caso in cui ogni dado precedente l'ultimo abbia fatto il massimo valore D) e S (nel caso tutti i dadi abbiano fatto 1).

in generale, dovrebbero dipendere da qualcosa di aleatorio come i dadi solo cose che in concreto beneficiano dall'avere un margine di imprevedibilità. Se si parte dai dadi, e poi ci si trova a correggerli perché sono troppo 'selvaggi', forse vale la pena di ripensarci. ;)

Non so quale sia la meccanica di cui abbisogni il tuo gioco, ma penso che questo ragionamento di Mario sia molto valido. Estremizzando, pensa all'esempio del d20 system: se per rendere sensato all'interno del gioco un lancio di dado occorre correggerlo con dei modificatori assurdi (pensa a una prova di abilità con +15), forse si può trovare un approccio che sia più adatto a ciò che devi fare.

Sono dell'idea che l'aleatorietà dei dadi sia il loro punto forte; se ci si trova a doverla correggere per evitare risultati indesiderati, probabilmente la procedura può essere affinata in qualche modo.
« Ultima modifica: 2012-09-11 22:29:55 da Matteo Turini »

Mattia Bulgarelli

  • Facilitatore Globale
  • Membro
  • *****
  • Mattia Bulgarelli
    • Mostra profilo
@Luca e Leonardo: WHOA. O_O
Datemi tempo, ci guardo con calma nei prossimi giorni (dopo il test delle prossime sere e quel riassunto che devo fare per/su Creatori Di Sogni, il forum).

@Gran Turini: capisco il problema, voglio semplificare e ridurre al minimo i numeroni.
Penso di aver trovato un sistema decente... devo solo testarlo. ^_^
Co-creatore di Dilemma! - Ninja tra i pirati a INC 2010 - Padre del motto "Basta Chiedere™!"

Tags: