Probabilità e percentuali.

Algoritmi, discussioni sulle possibili implementazioni, matematica, fisica e tutti gli argomenti correlati alla programmazione
Rispondi
Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Probabilità e percentuali.

Messaggio da aironenero »

Arieccomi con un'altra richiesta di algoritmo.
Dunque, ammettiamo di avere

Codice: Seleziona tutto

int NUM1; //che ha un qualsiasi valore
float PERCENT1; //una probabilità in centesimi
float PERCENT2; //Un'altra probabilità in centesimi
[...]
Io ad un certo punto devo calcolare dopo un evento in un gioco una probabilità che accada tot e un altra probabilità che accada un altro tot, definite da PERCENT1 e PERCENT2. Come faccio? :confuso:
posso calcolare un numero random di range 1-100 e vedere se è minore o uguale a una percentuale e nel caso lo fosse far accadere quell'evento (anche se a me non sembra poi così preciso come calcolo.) ma quando ho due possibili eventi e uno esclude l'altro, come facico ad avere una probabilità precisa, ovvero perfettamente random e che eseguita 100 volte mi dia più o meno delle estrazioni 1 pari a PERCENT1 e delle estrazioni 2 pari a PERCENT2.
i valori percent 1 e percent2 hanno la virgola e sommati non danno mai più di cento, anzi soon spesso minori. Mi accontento di pseudo codice, ma nel caso qualcuno voglia scrivermi il codice esatto, uso C#. Da quel che so far lavorare casualmente i computer è un bel problema.
Unity Developer
Immagine
Immagine

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: Probabilità e percentuali.

Messaggio da cp94 »

Una cosa tipo questa?

Codice: Seleziona tutto

float NUM = Random.Range(0.0f,PERCENT1+PERCENT2);
if (NUM>=0 && NUM<PERCENT1) {

}

if (NUM>PERCENT1 && NUM<PERCENT2) {

}
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: Probabilità e percentuali.

Messaggio da aironenero »

cp94 ha scritto:Una cosa tipo questa?

Codice: Seleziona tutto

float NUM = Random.Range(0.0f,PERCENT1+PERCENT2);
if (NUM>=0 && NUM<PERCENT1) {

}

if (NUM>PERCENT1 && NUM<PERCENT2) {

}
questo implica che una delle due percentuali sia magigore di un altra o no?
Unity Developer
Immagine
Immagine

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: Probabilità e percentuali.

Messaggio da cp94 »

Nono, non centra assolutamente niente!
Comunque ho dimenticato un '=' nel secondo if, dovrebbe essere NUM>=PERCENT1
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: Probabilità e percentuali.

Messaggio da aironenero »

cp94 ha scritto:Nono, non centra assolutamente niente!
Comunque ho dimenticato un '=' nel secondo if, dovrebbe essere NUM>=PERCENT1
difatti mi sembrava strano, provo e ti faccio sapere.
Unity Developer
Immagine
Immagine

Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: Probabilità e percentuali.

Messaggio da Nix »

cp94 ha scritto:Una cosa tipo questa?

Codice: Seleziona tutto

float NUM = Random.Range(0.0f,PERCENT1+PERCENT2);
if (NUM>=0 && NUM<PERCENT1) {

}

if (NUM>PERCENT1 && NUM<PERCENT2) {

}
Questo codice non fa quello che vuole lui. Lui ha detto che la somma delle percentuali può essere minore di 100, quindi c'è una certa probabilità che non si verifichi nessuno dei due eventi. Con il tuo codice invece uno dei due eventi accadrà necessariamente. Inoltre, generando col tuo codice un gran numero di eventi, le probabilità non saranno quelle specificate. La soluzione corretta è generare un numero da 0 a 100. Se il numero è minore della prima percentuale, accadrà il primo evento. Se è minore della somma della prima percentuale e della seconda, accadrà il secondo. Altrimenti, non ci sarà nessun evento. Anche in questo caso le percentuali possono avere qualunque valore, non c'è bisogno che una sia maggiore dell'altra.

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: Probabilità e percentuali.

Messaggio da aironenero »

Nix ha scritto:
cp94 ha scritto:Una cosa tipo questa?

Codice: Seleziona tutto

float NUM = Random.Range(0.0f,PERCENT1+PERCENT2);
if (NUM>=0 && NUM<PERCENT1) {

}

if (NUM>PERCENT1 && NUM<PERCENT2) {

}
Questo codice non fa quello che vuole lui. Lui ha detto che la somma delle percentuali può essere minore di 100, quindi c'è una certa probabilità che non si verifichi nessuno dei due eventi. Con il tuo codice invece uno dei due eventi accadrà necessariamente. Inoltre, generando col tuo codice un gran numero di eventi, le probabilità non saranno quelle specificate. La soluzione corretta è generare un numero da 0 a 100. Se il numero è minore della prima percentuale, accadrà il primo evento. Se è minore della somma della prima percentuale e della seconda, accadrà il secondo. Altrimenti, non ci sarà nessun evento. Anche in questo caso le percentuali possono avere qualunque valore, non c'è bisogno che una sia maggiore dell'altra.
Nix, col tuo metodo quindi dovrebbe funzionare? e per la virgola?
Unity Developer
Immagine
Immagine

Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: Probabilità e percentuali.

Messaggio da Nix »

Sì, e la virgola non è un problema. Se però usi un int come nel codice che hai messo prima, sarà poco preciso. Sicuramente il linguaggio che usi ha funzioni random per i float.

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: Probabilità e percentuali.

Messaggio da cp94 »

Ma lui ha detto che gli eventi sono in un numero definito e uno deve escludere tutti gli altri, senza avere possibilità nulla.
Inoltre il mio codice è ininfluente sul fatto che il totale delle percentuali sia minore o maggiore di 100. Con quest'ultimo sommo solamente le varie percentuali e in base a quelle faccio eseguire un operazione.
Es: 30%, 20%, 35%.
Totale = 85 (è il 100%)
Prendendo un numero da 0 a 85 avrò il 30% che sia tra 0 e 30, il 20% che sia tra 30 e 50 e il 35% che sia tra 50 e 85.
Magari mi sbaglio eh, illuminami :hum:
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: Probabilità e percentuali.

Messaggio da Nix »

cp94 ha scritto:Ma lui ha detto che gli eventi sono in un numero definito e uno deve escludere tutti gli altri, senza avere possibilità nulla.
Se non c'è una possibilità nulla, come fa la somma delle percentuali ad essere minore di 100? Se ci fosse un evento in ogni caso, la probabilità che venga scelto un evento qualunque sarebbe ovviamente 100%. Le percentuali dovrebbero esprimere le possiblità su 100 che un evento accade. Lui ha detto che sono percentuali, se non sono su cento, non lo sono realmente. Inoltre, vuole che la percentuale degli eventi accaduti si avvicini a quella prevista. Se per esempio la probabilità del primo evento è 15%, e quella del secondo è 20%, allora ogni volta che viene "lanciato il dado" le probabilità di uscire dovrebbero essere quelle. Tuttavia, col tuo sistema, il primo evento sarebbe spuntato il 43% delle volte, e il secondo il 57%. Se aironenero si fosse espresso male e quelle non fossero realmente percentuali, allora avresti ragione tu.

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: Probabilità e percentuali.

Messaggio da aironenero »

cp94 ha scritto:Ma lui ha detto che gli eventi sono in un numero definito e uno deve escludere tutti gli altri, senza avere possibilità nulla.
Inoltre il mio codice è ininfluente sul fatto che il totale delle percentuali sia minore o maggiore di 100. Con quest'ultimo sommo solamente le varie percentuali e in base a quelle faccio eseguire un operazione.
Es: 30%, 20%, 35%.
Totale = 85 (è il 100%)
Prendendo un numero da 0 a 85 avrò il 30% che sia tra 0 e 30, il 20% che sia tra 30 e 50 e il 35% che sia tra 50 e 85.
Magari mi sbaglio eh, illuminami :hum:
Mi hai frainteso, io ho bisogno anche dell'evento nullo. Altrimenti come dice nix perchè la percentuale potrebbe essere meno di 100?
Unity Developer
Immagine
Immagine

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: Probabilità e percentuali.

Messaggio da cp94 »

aironenero ha scritto:
cp94 ha scritto:Ma lui ha detto che gli eventi sono in un numero definito e uno deve escludere tutti gli altri, senza avere possibilità nulla.
Inoltre il mio codice è ininfluente sul fatto che il totale delle percentuali sia minore o maggiore di 100. Con quest'ultimo sommo solamente le varie percentuali e in base a quelle faccio eseguire un operazione.
Es: 30%, 20%, 35%.
Totale = 85 (è il 100%)
Prendendo un numero da 0 a 85 avrò il 30% che sia tra 0 e 30, il 20% che sia tra 30 e 50 e il 35% che sia tra 50 e 85.
Magari mi sbaglio eh, illuminami :hum:
Mi hai frainteso, io ho bisogno anche dell'evento nullo. Altrimenti come dice nix perchè la percentuale potrebbe essere meno di 100?
Ok, avevo inteso male allora. In tal caso ciò che ha scritto Nix va benissimo.
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: Probabilità e percentuali.

Messaggio da Tizzio »

La soluzione corretta è generare un numero da 0 a 100.
Se il numero è minore della prima percentuale, accadrà il primo evento. Se è minore della somma della prima percentuale e della seconda, accadrà il secondo.

La soluzione di nix è perfetta, devi solo generalizzarla, creando un numero da 0 a precision e ricalcolando il range delle percentuali che passi
Sarebbe meglio se ti facessi una classe che gestisca il choose, con metodi del tipo:
- void EventSetRange(range di precisione)
- int EventAdd(percentuale, mio_delegate) //se la somma dei tuoi eventi supera precision ritorna -1, altrimenti un int(id dell'evento)
- EventRemove(eventId);
- void EventPerform() //genera un numero casuale ed esegue un evento

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: Probabilità e percentuali.

Messaggio da aironenero »

- int EventAdd(percentuale, mio_delegate) //se la somma dei tuoi eventi supera precision ritorna -1, altrimenti un int(id dell'evento)

emh, aspetta, perchè un delegato? So cosa sono, ma non ne vedo l'utilità in questo caso. Inoltre non capisco come mai dovrei settare un range di precisione.

Edit, controllata la documentazione C#, a quanto pare non esiste un metodo che generi un numero random con la virgola, di conseguenza me lo sto creando io:

Codice: Seleziona tutto

float RandomFloatRange(float Start, float End)
        {
            int Integer = Random.Next((int)Start, (int)End);
            float Comma = (float)Random.NextDouble();
            return (float)Integer + Comma;
        }
Unity Developer
Immagine
Immagine

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: Probabilità e percentuali.

Messaggio da cp94 »

aironenero ha scritto:non esiste un metodo che generi un numero random con la virgola
Come no?
Random.Range(float min, float max);
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: Probabilità e percentuali.

Messaggio da aironenero »

cp94 ha scritto:
aironenero ha scritto:non esiste un metodo che generi un numero random con la virgola
Come no?
Random.Range(float min, float max);
Non mi risulta.
Immagine
Edit: ecco da dove ti risulta, però io non sto usando unity quindi...
Unity Developer
Immagine
Immagine

Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: Probabilità e percentuali.

Messaggio da Nix »

Non c'è bisogno di usare due funzioni random, basta moltiplicare il valore restituito da NextDouble per il valore massimo, 100 (ma se il valore minimo è diverso da 0, devi sommarlo al prodotto tra il valore random e la differenza tra massimo e minimo).

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: Probabilità e percentuali.

Messaggio da aironenero »

Nix ha scritto:Non c'è bisogno di usare due funzioni random, basta moltiplicare il valore restituito da NextDouble per il valore massimo, 100 (ma se il valore minimo è diverso da 0, devi sommarlo al prodotto tra il valore random e la differenza tra massimo e minimo).
grazie del tip! :D
Unity Developer
Immagine
Immagine

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti