Italian help su algoritmo random

Xfood

Expert
Licensed User
Salve ragazzi, vorrei realizzare un algoritmo che, data una lista di elementi che hanno ognuno una certa probabilità di uscire, mi estragga un elemento casuale tenendo conto delle probabilità fornite a inizio programma. La lista dovrebbe contenere una cinquantina di elementi
Qualcuno ha qualche idea di come realizzare un algoritmo del genere? Grazie
 

Star-Dust

Expert
Licensed User
Ti stai buttando nel gioco d'azzardo?
 

Star-Dust

Expert
Licensed User
Spiega meglio cosavuoi ottenere
 

Xfood

Expert
Licensed User
Supponiamo di avere una lista tipo:
Giovanni 30%
Marco 20%
Carlo 15%
Salvo 15%
Francesco 10%
Luca 10%
Quindi su questa base, pigiando il pulsante estrai, dovrei estrarre un nome a caso , considerando le probabilita di uscita.
Per esempio se premo il pulsante estrai 100 volte , in teoria dovrebbe uscirmi 30 volte giovanni, 10 volte francesco e cosi via.
 

ivanomonti

Well-Known Member
Licensed User
Longtime User
Supponiamo di avere una lista tipo:
Giovanni 30%
Marco 20%
Carlo 15%
Salvo 15%
Francesco 10%
Luca 10%
Quindi su questa base, pigiando il pulsante estrai, dovrei estrarre un nome a caso , considerando le probabilita di uscita.
Per esempio se premo il pulsante estrai 100 volte , in teoria dovrebbe uscirmi 30 volte giovanni, 10 volte francesco e cosi via.
vedi se ti piace

butto li:
private Sub sRandomAzzardoMilitare
    Dim lst As List
    lst.AddAll(Array As String("bingo","bongo","bango","bunga","bunga","figa"))
    Log(lst.Get(Rnd(0,lst.Size-1)))
End Sub
 

Xfood

Expert
Licensed User
vedi se ti piace

butto li:
private Sub sRandomAzzardoMilitare
    Dim lst As List
    lst.AddAll(Array As String("bingo","bongo","bango","bunga","bunga","figa"))
    Log(lst.Get(Rnd(0,lst.Size-1)))
End Sub
Diciamo che cosi tutti gli elementi hanno la stessa probabilita' di uscita , a me servirebbe gestire le diverse probabilita' di uscita.
 

Star-Dust

Expert
Licensed User
Farei in maniera semplicistica
B4X:
A=RND(0,100)
If A>=0 AND A<30 Then log("Giovanni")
If A>=30 AND A<50 Then log("Marco")
If A>=50 AND A<65 Then log("Carlo")
If A>=65 AND A<80 Then log("Salvo")
If A>=80 AND A<90 Then log("Francesco")
If A>=90 AND A<100 Then log("Luca")

Ovviamente si può usare un algoritmo più raffinato ma sono con lo smartphone e posso scrivere solo questo
 

Xfood

Expert
Licensed User
Farei in maniera semplicistica
B4X:
A=RND(0,100)
If A>=0 AND A<30 Then log("Giovanni")
If A>=30 AND A<50 Then log("Marco")
If A>=50 AND A<45 Then log("Carlo")
Ecc..
Un po troppo semplificata, perche se ho piu elementi con la stessa percentuale, come verrebbe gestita?
 

ivanomonti

Well-Known Member
Licensed User
Longtime User
Diciamo che cosi tutti gli elementi hanno la stessa probabilita' di uscita , a me servirebbe gestire le diverse probabilita' di uscita.
allora vuoi barare, se bingo vuoi ce esca 1 volta su 100 devi cmq mettere un valore di confronto e tenere memoria delle volte che bingo è stato scelto da rdn, altrimenti non riesci
 

Star-Dust

Expert
Licensed User
Un po troppo semplificata, perche se ho piu elementi con la stessa percentuale, come verrebbe gestita?
Rivedi il codice e lo capisci come è gestita.

Poi quando ho tempo forse ti codifico come farlo con una lista o map
 

Star-Dust

Expert
Licensed User
Ovviamente questo metodo non ti garantisce che l'elemento che selezionando il 30% di possibilità a fine giro sarà estratto il 30% delle volte.

Piuttosto che generando un numero random lui ha il 30% di possibilità di essere scelto.

Quindi su 10 scelte potrebbe capitare due volte e quindi il 20%, ma su 20 estrazioni potrebbe capitare 8 volte e quindi il 40%. Su 50 estrazioni potrebbe capitare 15 volte quindi rispettare il 30%. Ma su 100 volte? Beh hai capito il concetto.

Mentre se vuoi un risultato diverso, ovvero che la persona con percentuale del 30% deve essere estratta al 30% del del totale delle estrazioni, è necessario che tu sappia quando siano il numero totali dell'estrazioni. Calcolare a quanto corrisponde il 30% del totale delle estrazioni e successivamente creare un algoritmo specifico molto più complesso di quello che ti ho suggerito io che possa tenere conto di queste percentuali.

Se tu parli con quelle che truccano alle slot machine avrai indicazioni specifiche
 

udg

Expert
Licensed User
Longtime User
Per rimanere al codice di @Star-Dust , qualcosa del genere
B4X:
dim mylist as list
list.initialize
list.addall(array as string("Giovanni","Mrco"...))
....
A=RND(0,100)
If A>=0 AND A<30 Then log(mylist(0))
If A>=30 AND A<50 Then log(mylist(1))
Avrai notato che i range di ciascun test corrispondono alle percentuali da te previste per i vari nominativi.
La cosa potrebbe essere anche più"dinamica" se prevedi un type con nominativo e percentuale e imposti il test con limite superiore pari a quanto ricavato dall'elemento nel type e limite inferiore pari al "precedente" limite superiore.

Un altro sistema potrebbe essere una lunga lista (100 elementi), dove ciascun nominativo appare tante volte quanta è la sua percentuale. Con un'estrazione random becchi a caso nel listone sapendo che Giovanni aveva il 30% di probabilità di uscire, Marco 20%..etc
Se, a listone completo, li mischi (cerca shuffle) hai ancora più entropia ma rispetti le probabilità di ciascuno.

Sono solo considerazioni in libertà. Oggi qui piove e mi sa che mi tocca lavorare h24....
 

Star-Dust

Expert
Licensed User
Per rimanere al codice di @Star-Dust , qualcosa del genere
B4X:
dim mylist as list
list.initialize
list.addall(array as string("Giovanni","Mrco"...))
....
A=RND(0,100)
If A>=0 AND A<30 Then log(mylist(0))
If A>=30 AND A<50 Then log(mylist(1))
Avrai notato che i range di ciascun test corrispondono alle percentuali da te previste per i vari nominativi.
La cosa potrebbe essere anche più"dinamica" se prevedi un type con nominativo e percentuale e imposti il test con limite superiore pari a quanto ricavato dall'elemento nel type e limite inferiore pari al "precedente" limite superiore.

Un altro sistema potrebbe essere u7na lunga li8sta (100 elementi", dove ciascun nominativo appare tante volte quanta è la sua percentuale. Con un'estrazione random becchi a caso nel listone sapendo che Giovanniaveva il 30% di probabilità di uscire, MArco 20%..etc
Se, a listone completo, li mischi (cerca shuffle) hai ancora più entropia ma rispetti le probabilità di ciascuno.

Sono solo considerazioni in libertà. Oggi qui piove e mi sa che mi tocca lavorare h24....
Qua pioviggina lavorerò solo 4 ore
 

udg

Expert
Licensed User
Longtime User

Xfood

Expert
Licensed User
Ok, mi piacerebbe avere un esempio connuna lista dinamica,
Vistoche le percentuali erano messi a caso, per far capire il concetto, quindi in realta' compilo la lista e metto le tessere acquistate per ogni utente, e poi con l'estrazione casuale dovrei estrarre il nominativo vincente, l'esempio di @Star-Dust mi va bene, semplicemtente mi servirebbe lonstesso esempio con una lista dinamica 🙏
 

udg

Expert
Licensed User
Longtime User
Se lo scopo è quello di premiare un cliente tra quelli che abbiano inserito a sistema una o più tessere/coupon, ma non sai a priori il numero di tessere, allora rivaluta l'idea del listone ed l'eventuale operazione di shuffle.
Qualcosa tipo questo.
 

Xfood

Expert
Licensed User
Il numero di tessere lo so gia a priori,
Ma come modifico questo codice,
Per sostituire per esempio il 30 di Carlo con 15, oppure con 10 , visto che questo numero lo so, ma e' scritto su una lista?

RND(0,100)
If A>=0 AND A<30 Then log(mylist(0))
If A>=30 AND A<50 Then log(mylist(1))
 
Top