Italian help su algoritmo random

Aldo's

Active Member
Licensed User
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?
La lista è interna (lista/array) o esterna al sorgente (db)?
In entrambi i casi, partendo dall'esempio di @Star-Dust puoi creare un ciclo che legge la lista e aggiorna una variabile numerica che controlla la percentuale.
 

udg

Expert
Licensed User
Longtime User
Ammesso che tu abbia 174 tessere in totale, cosa fai? Conti quante volte hai la numero 34 e ne calcoli la percentuale? Un lavoraccio!
Meglio il listone. Inserisci "al buio" le tessere che hai collezionato e poi procedi con l'estrazione (preceduta o meno dalla mischiata).
 

Star-Dust

Expert
Licensed User
Longtime User
Ragazzi io lavoro, poco ma lavoro... dopo di questo arrangiatevi
B4X:
'Il totale ovviamente dev'essere cento
    Dim M As Map = CreateMap("Arazzio":30,"Tanino":12,"Iaffio":23,"Currau":10,"Turi":15,"Ianu":5,"Pieppu":5)
  
    Dim Perc As Int = Rnd(1,101)
    Dim TargetMax As Int = 0
    For Each Nome As String In M.Keys
        TargetMax=TargetMax + M.Get(Nome)
        If Perc<=TargetMax Then
            Log(Nome)
            Exit
        End If
    Next

anche cosi se vuoi controllare il limite minimo e non uscire dal ciclo con Exit ma farlo tutto (non necessario)
B4X:
    'Il totale ovviamente dev'essere cento
    Dim M As Map = CreateMap("Arazzio":30,"Tanino":12,"Iaffio":23,"Currau":10,"Turi":15,"Ianu":5,"Pieppu":5)
   
    Dim Perc As Int = Rnd(1,101)
    Dim TargetMin As Int = 0
    Dim TargetMax As Int = 0
    For Each Nome As String In M.Keys
        TargetMax=TargetMax + M.Get(Nome)
        If Perc>TargetMin And Perc<=TargetMax Then Log(Nome)
        TargetMin=TargetMax
    Next
 

Xfood

Expert
Licensed User
Diciamo che le tessere in totale sono 100,
Ogni utente compra il numero che vuole, quindi avro Carlo 5, marco 36, e cosi via,
Ogni lista ha 100 tessere e ognuno acquista quello che vuole, e poi estrazione tipo il suggerimento di @Star-Dust , ma con la lista e le % ( n. Tessere) dinamico.
 

Star-Dust

Expert
Licensed User
Longtime User
Diciamo che le tessere in totale sono 100,
Ogni utente compra il numero che vuole, quindi avro Carlo 5, marco 36, e cosi via,
Ogni lista ha 100 tessere e ognuno acquista quello che vuole, e poi estrazione tipo il suggerimento di @Star-Dust , ma con la lista e le % ( n. Tessere) dinamico.
Quindi chi sceglie il numero piu alto ha piu possibilità il percentuale? Io voglio il numero 100.....
 

Xfood

Expert
Licensed User
Ragazzi io lavoro, poco ma lavoro... dopo di questo arrangiatevi
B4X:
'Il totale ovviamente dev'essere cento
    Dim M As Map = CreateMap("Arazzio":30,"Tanino":12,"Iaffio":23,"Currau":10,"Turi":15,"Ianu":5,"Pieppu":5)
  
    Dim Perc As Int = Rnd(1,101)
    Dim TargetMax As Int = 0
    For Each Nome As String In M.Keys
        TargetMax=TargetMax + M.Get(Nome)
        If Perc<=TargetMax Then
            Log(Nome)
            Exit
        End If
    Next

anche cosi se vuoi controllare il limite minimo e non uscire dal ciclo con Exit ma farlo tutto (non necessario)
B4X:
    'Il totale ovviamente dev'essere cento
    Dim M As Map = CreateMap("Arazzio":30,"Tanino":12,"Iaffio":23,"Currau":10,"Turi":15,"Ianu":5,"Pieppu":5)
   
    Dim Perc As Int = Rnd(1,101)
    Dim TargetMin As Int = 0
    Dim TargetMax As Int = 0
    For Each Nome As String In M.Keys
        TargetMax=TargetMax + M.Get(Nome)
        If Perc>TargetMin And Perc<=TargetMax Then Log(Nome)
        TargetMin=TargetMax
    Next
Penso che questa soluzione va bene, provo.
Grazie.
 

Star-Dust

Expert
Licensed User
Longtime User
Ma non è più sensato
No, dovresti comprare 100 tessere.???
Non è più sensato che fai una Map (o Lista) con numero tessera e nome acquirente (e se uno acquista piu tessere nella map Sara inserito tante volte quante Tessere ha Acquistato) e un RND per il numero delle tessere?

B4X:
Dim Tessere as Map = CreateMap (1,"Arazzio",2:"Ciccio")

 Dim TesseraEstratta As Int = Rnd(0,Tessere.Size)
Log(Tessere.Get(TesseraEstratta)
Si potrebbe fare anche con una Lista se le tessere sono numerate progressivamente da 1 a 100

B4X:
Dim Tessere as List = Array as string ("Arazzio","Ciccio")

 Dim TesseraEstratta As Int = Rnd(0,Tessere.Size)
Log(Tessere.Get(TesseraEstratta)
 

udg

Expert
Licensed User
Longtime User
Capito, è una classica riffa.
Hai 100 tagliandi ed ognuno ne compra quanti ne vuole. Poi estrai il numero vincente.
Se acquisto tutti i tagliandi, vinco di sicuro ma ho speso più del valore del premio. Però, vuoi mettere la soddisfazione.. heheh

Nella realtà mi è capitato due volte di seguito alla riffa natalizia organizzata dal portiere del mio palazzo.
Contavo sul "non c'è due senza tre" per il terzo anno, ma è andata male.
ps: era un modo per consentirgli un minimo guadagno extra e volentieri gli cedevo gran parte del cesto di prodotti vinti
 

Star-Dust

Expert
Licensed User
Longtime User
Capito, è una classica riffa.
Hai 100 tagliandi ed ognuno ne compra quanti ne vuole. Poi estrai il numero vincente.
Se acquisto tutti i tagliandi, vinco di sicuro ma ho speso più del valore del premio. però, vuoi mettere la soddisfazione.. heheh

Nella realtà mi è capitato due volte di seguito alla riffa natalizia organizzata dal portiere del mio palazzo.
Contavo sul "non c'è due senza tre" per il terzo anno, ma è andata male.
ps: era un modo per consentirgli un minimo guadagno extra e volentieri gli cedevo gran parte del cesto di prodotti vinti
Mi sa che questa riffa
è una truffa
e finisce in rissa
(fa pure rima)
 

udg

Expert
Licensed User
Longtime User
La riffa è una truffa
lo so, è solo fuffa
tu vuoi che io spenda
perchè a te renda
prodotti scadenti
per clienti dementi
fammi uno sconto
illumina il mondo

Dal singolo "uè fra' " di prossima pubblicazione..heheh
 

Star-Dust

Expert
Licensed User
Longtime User
La riffa è una truffa
lo so, è solo fuffa
tu vuoi che io spenda
perchè a te renda
prodotti scadenti
per clienti dementi
fammi uno sconto
illumina il mondo

Dal singolo "uè fra' " di prossima pubblicazione..heheh
 
  • Haha
Reactions: udg

Xfood

Expert
Licensed User
Ma non è più sensato

Non è più sensato che fai una Map (o Lista) con numero tessera e nome acquirente (e se uno acquista piu tessere nella map Sara inserito tante volte quante Tessere ha Acquistato) e un RND per il numero delle tessere?

B4X:
Dim Tessere as Map = CreateMap (1,"Arazzio",2:"Ciccio")

 Dim TesseraEstratta As Int = Rnd(0,Tessere.Size)
Log(Tessere.Get(TesseraEstratta)
Si potrebbe fare anche con una Lista se le tessere sono numerate progressivamente da 1 a 100

B4X:
Dim Tessere as List = Array as string ("Arazzio","Ciccio")

 Dim TesseraEstratta As Int = Rnd(0,Tessere.Size)
Log(Tessere.Get(TesseraEstratta)
Si, si potrebbe fare anche cosi, ma pensavo fosse piu pulito inserire il numero di tessere acquistate da Tanino, e da carlo, e poi con l'algoritmo come mi hai consigliato sopra, estrarre il nome vincente. Vedo di convertire il tuo esempio da mappa a lista, perche le leste vorrei salvarle in un file csv, e poi caricare la lista ed elaborare il vincente.
 

Star-Dust

Expert
Licensed User
Longtime User
Si, si potrebbe fare anche cosi, ma pensavo fosse piu pulito inserire il numero di tessere acquistate da Tanino, e da carlo, e poi con l'algoritmo come mi hai consigliato sopra, estrarre il nome vincente. Vedo di convertire il tuo esempio da mappa a lista, perche le leste vorrei salvarle in un file csv, e poi caricare la lista ed elaborare il vincente.
Quindi volvevi fare un estrazione mettendo insieme le tessere delle persone che ne acquistano più di uno .... quindi volevi fare il presidente del CCCS ?
 

udg

Expert
Licensed User
Longtime User
Ma invece di tutto questo fastidio, non potresti utilizzare questa semplice funzione?
B4X:
'Estrae il nome del vincitore
Private Sub Estrazione(mylist as list)
Log("Il vincitore è: Xfood")
'parte opzionale
for j=0 to mylist.size-1
log($"${mylist.get(j)} hai perso, sfigato!"$)
next
end sub

ps: vi ho già detto che qui piove e sembra che sia sera? che due....
 

Xfood

Expert
Licensed User
E' una sorta di pesca scolastica, ogni premio ha 100 tessere, e acquisti le tessere che vuoi,
Hai 10 premi, quindi 10 liste, e poi tramite generatore casuale estrai il vincitore per ogni lista
 

udg

Expert
Licensed User
Longtime User
Aaaah, scolastica. Allora devo cambiare il rap di cui sopra.... :)

Sogno gastronomico in aula anni '70

In piedi, solo alla lavagna
penso, ma oggi che se magna?
fisso l'indomita equazione
e sogno la colazione.
Pesa tanto sto gessetto
di salame più di un etto
rimedio ancora un sette
già conto le mie fette
Al banco son seduto
nulla ho ancor bevuto
Suona forte la campanella
arriva la mia ... (vi risparmio la volgare rima che, in dialetto, indica la ragazza)

D'accordo, è un po' forzato, ma scrivevo mentre ero al telefono.
ps: se non torna il sole, sono rovinato..

pps: ok, basta. ora caffé e si lavora seriamente :(
 
Last edited:

ivanomonti

Expert
Licensed User
Longtime 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))
ovvio se i dati non sonodi tipo costante ma variabile
 
Top