Programma Estrazioni Win For Life lo vogliamo realizzare ????
#1
Inviato 08 ottobre 2009 - 10:10
Ciò che avevo pensato era quello di scrivere qualche riga in mShell e far generare a schermo 10 numeri. L'importante è che i numeri generati siano compresi tra 1 e 20 e soprattutto che nei nueri generati in automatico non ci siano nueri doppioni.
Quello che ho fatto io, e che qualcuno di Voi con un po di volontà dovrebbe modificare, è stato buttare giù poche righe.......vegono generati 10 numeri, il problema è che spesso vengono generati numeri doppi e non risco a risolvere :
use math;
cls();
for b=1 to 10 do
sleep(400);
a=math.random()*10000;
c=a%10+1;
print c+b
end
Quando viene dato il comando go vengono generati 10 numeri.
Quindi, dobbiamo fare in modo che non vengano generati numeri uguali ed i oltre a me sembrerebbe più carino che i numeri invece di essere stampati a video uno sotto l'altro vengano visualizzati uno di fianco all'altro suddivisi da uno spazio.
Ciao, vediamo ce cosa riusciamo a fare. Vi immaginate se con una combinazione creata con il nostro celulare potessimo vincere 4000 euro al mese per ben 20 anni !!!!!!!!!!!!!!!!!!!!
#2
Inviato 08 ottobre 2009 - 13:44
Anche perchè non ci sono studi sistemistici dietro, ma si tratta soltanto di generare combinazioni senza ripetizioni di numeri casuali.
Comunque ecco qui il codice, non testato perchè ho il cell in assistenza
use math as m, array as a cls() estratti=[] for i=1 to 10 do do numero=m.trunc(m.random()*20+1); until a.index(estratti,numero)=-1; append(estratti,numero); end for i in estratti do print i; end
oppure gestiamo l'estrazione diversamente in modo che non ci sia la possibilità che siano generati numeri doppi, il codice precedente infatti gestisce il fenomeno nel ciclo do rigenerando il numero fino a quando non viene trovato nei numeri già estratti.
use math as m, array as a cls() numeri=[] estratti=[] for i=1 to 20 do append(numeri,i); end for i=1 to 10 do pos=m.trunc(m.random()*len(numeri)); numero=numeri[pos]; append(estratti,numero); a.remove(numeri,pos,1) end for i in estratti do print i; end
Messaggio modificato da xMetallicax il 09 ottobre 2009 - 12:48
#3
Inviato 08 ottobre 2009 - 14:44
import random ### Array che contiene i numeri da giocare ### numerivincenti = [] ### Totale numeri da estrarre ### numeridagiocare = 10 ### Numero da cui partire ### primonumero = 1 ### Numero massimo da poter giocare ### ultimonumero = 90 while len(numerivincenti) < numeridagiocare: ### Genero un numero 'casuale' tra 1 e 90 ### numero = random.randint(primonumero, ultimonumero) ### Verifico se ho gia' inserito il numero nell'array dei numeri da giocare ### ### Se non e' stato inserito lo aggiungo, altrimenti proseguo ### if not numero in numerivincenti: numerivincenti.append(numero) print numerivincenti
#4
Inviato 08 ottobre 2009 - 17:33
xMetallicax, il 08/10/2009 - 14:44, ha scritto:
Complimenti per le interessanti alternative utilizzate, anche oggi ho imparato qualcosa.
Nel secondo esempio, dopo numeri=[] va aggiunto estratti[] altrimenti mShell mugugna.
Ho dovuto concentrare tutta la mia capacità intelletuale per scovare detto errore....
Non farti fregare lento ha semplicemente eseguito il tuo programma in mShell! ci ha pensato mShell a indicargli l'errore.
Alter....non potevi stare zitto!..... è vero
#5
Inviato 08 ottobre 2009 - 17:41
mi ero dimenticato
ho corretto il post
grazie lento
#6
Inviato 08 ottobre 2009 - 18:11
xMetallicax, il 08/10/2009 - 14:44, ha scritto:
use math as m, array as a cls() estratti=[] for i=1 to 10 do do numero=m.trunc(m.random()*20+1); until a.index(estratti,numero)=-1; append(estratti,numero); end for i in estratti do print i; end
O ragazzi, vi dico la verità....però non spargete la voce....6587gianluca è contentissimo perchè il tutto funziona che è una meraviglia....ma non ci ha capito niente in quello che c'è scritto sopra.....
Si, in effetti alter ha ragione, leggo e rileggo e cerco di capire lo script.
Grazie mille ragazzi.-
#7
Inviato 08 ottobre 2009 - 18:46
#8
Inviato 08 ottobre 2009 - 19:25
#9
Inviato 08 ottobre 2009 - 20:25
2) perchè spesse volte capita che stampi un numero già stampato qualche riga prima (e ciò non è consentito nel gioco win for life)
3) ... boh?? se proprio vuoi ti faccio uno screen
EDIT: Ecco gli screen, del mio male
Download file
-
wfl.zip (64,79K)
Numero di downloads: 22
Messaggio modificato da madhacker il 08 ottobre 2009 - 20:28
#10
Inviato 08 ottobre 2009 - 21:34
madhacker, il 08/10/2009 - 21:25, ha scritto:
2) perchè spesse volte capita che stampi un numero già stampato qualche riga prima (e ciò non è consentito nel gioco win for life)
3) ... boh?? se proprio vuoi ti faccio uno screen
EDIT: Ecco gli screen, del mio male
Donde bocca veritade......non maligna....tua esser.
Ma il problema lo riscontro solo con la seconda versione.
La prima mi funziona benissimo.
Domani quando sarò libero dai fumi dell'alcool?....no...non alcool....ma solo della stanchezza..lavorativa......
tenterò di capire la logica utilizzata.
Comunque il limite da 1 a 20 è stato espressamente richiesto.
E' sempre un piacere discutere in questo forum......
#11
Inviato 09 ottobre 2009 - 08:42
io credo che nel secondo esempio di metallica si possa anche eliminare use array as a in quanto non viene richiamato, a differenza del primo codice.
per far sì che non ci siano "doppioni" bisogna verificare prima dell'append se il numero è già presente nell'array o meno. qualora non lo fosse lo si aggiunge; però poi andrebbe sostituito il ciclo for con il ciclo while fino al raggiungimento della lunghezza desiderata dell'array
EDIT: questo codice non ritorna numeri "doppioni", ma, come quello di metallica, inizia sempre per 12!!
use math as m cls() numeri=[] estratti=[] for i=1 to 20 do append(numeri,i); end do numero=numeri[m.trunc(m.random()*len(numeri))]; esistente=false; for i in estratti do if i=numero then esistente=true; end; end; if not esistente then append(estratti,numero); print numero; end; until len(estratti)=10;
mi sono soltanto limitato a correggere quello di metallica
Messaggio modificato da madhacker il 09 ottobre 2009 - 09:06
#12
Inviato 09 ottobre 2009 - 09:09
1 use math as m, array as a 2 3 cls() 4 estratti=[] 5 6 for i=1 to 10 do 7 do 8 numero=m.trunc(m.random()*20+1); 9 until a.index(estratti,numero)=-1; 10 append(estratti,numero); 11 end 12 13 for i in estratti do 14 print i; 15 end
A grandi linee la logica qui riportata può essere suddivisa in due fasi importanti.
1) La generazione dei numeri casuali da 1 a 20.
2) La verifica che non siano doppi per 10 numeri.
1 Fase:
math.random() rende un numero decimale compreso tra 0 e il valore più prossimo ad 1, perciò non darà mai 1.
Il numero reso sarà quindi sempre un 0 virgola qualcosa (Es. 0,8967 0,001 0,055 0,989)
Il valore che noi vogliamo invece è 1-20 per ottenere questo moltiplica il numero per 20 math.random()*20 ottenendo
_ da precedenti esempi (Es. 0,8967*20 0,001*20 0,055*20 0,989*20)-> (Es. 17,934 0,020 1,100 19,78)
_ come si vede considerando 0 e 1 * 20 si ottiene 0 e 20 come valori estremi resi, ma dato che math.random()
_ non genera mai 1 e che vogliamo numeri da 1 a 20 ai risultati di math.random()*20 basta aggiungere +1
_ math.random()*20+1 e avremo valori tra 1 e 20.
_ (Es. 17,934+1 0,020+1 1,100+1 19,78+1)->(Es. 18,934 1,020 2,100 20,78)
Ora ci dobbiamo sbarazzare dei decimali.
_Questo lo fà la funzione math.trunc() che (tronca) elimina tutto quello che cè dopo la virgola.
Dunque: numero=math.trunc(math.random()*20+1); Genera il numero casuale da 1 a 20.
2 Fase:
Il valore ottenuto e messo in numero (Vedi riga prog. 8) e si trova in un ciclo ripetitivo do...until
_ l'unico modo per uscire da questo ciclo è che la funzione array.index(estratti,numero) renda un -1.
_ se non rende -1 ripete il ciclo creando un nuovo numero casuale e lo assegna sempre a numero.
array.index(array,valore) è una funzione che permette di controllare tutte le (caselle) di array e confrontarle
_ con valore, se corrisponde rende il numero di casella del'array che la contiene (perciò può rendere 0,1,2,ecc.)
_ se non corrisponde a nessuna casella rende il valore -1.
Và premesso che alla riga 4 si è dichiarato un array estratti contenente nessuna casella cioè vuoto perciò questo primo
_ confronto 9 until a.index(estratti,numero)=-1; di sicuro rende -1 (Confrontando un array vuoto con un valore numero da
_ sempre -1)
Usciti dal ciclo do....until significa che numero non è uguale a nessun numero già contenuto in estratti[] ,
_ la riga 10 append(estratti,numero); crea una nuova posizione nel'array estratti[] e vi assegna il valore numero.
_ (nel primo caso lo assegna a estratti[0]=numero )
Il ciclo 16 for i=1 to 10 do obbliga a ripetere tutto quanto sopra spiegato finchè in estratti[] ci siano 10 numeri
Dalla riga 13 in poi non lo spiego.....
Per vederlo più semplice si poteva scrivere anche così
1 use math as m, array as a; 2 3 cls(); 4 estratti=[0,0,0,0,0,0,0,0,0,0]; 5 6 for i=0 to 9 do 7 do 8 numero=m.trunc(m.random()*20+1); 9 until a.index(estratti,numero)=-1; 10 estratti[i]=numero; 11 end 12 13 for i in estratti do 14 print i; 15 end
Personalmente credo che funzioni, o sbaglio?
'6587gianluca' spero che la spiegazione passo passo sia chiara.
Messaggio modificato da lento il 09 ottobre 2009 - 09:49
#13
Inviato 09 ottobre 2009 - 09:32
genera soltanto un numero, per gli altri restituisce sempre 0
invece non capisco come mai il secondo esempio di metallica restituisca sempre 12 come inizio
Messaggio modificato da madhacker il 09 ottobre 2009 - 09:33
#14
Inviato 09 ottobre 2009 - 09:39
madhacker, il 09/10/2009 - 09:42, ha scritto:
Ottima la tua revisione di 'metallica'
@'metallica' se trovi tempo...ci faresti una breve spiegazione del tuo secondo codice....a nome di tutti gli abitanti di mShell.
(Paese immaginario dove la moneta di scambio è use e a scuola ci si va math.random() )
#15
Inviato 09 ottobre 2009 - 09:43
non esistono in mshell altre funzioni che generano numeri casuali??
#16
Inviato 09 ottobre 2009 - 09:54
madhacker, il 09/10/2009 - 10:43, ha scritto:
non esistono in mshell altre funzioni che generano numeri casuali??
Si in efetti l'ho notato, man mano che si avanti per le prove ogni tanto il primo numero incrementa di una unità.
Devo dire però che con quelle poche righe che avevo inerito nel primo post ciò non accade mai, cioè la prima cifra risulta essere sempre diversa....però non c'è controllo di doppioni.
use math;
cls();
for b=1 to 10 do
sleep(400);
a=math.random()*10000;
c=a%10+1;
print c+b
end
#17
Inviato 09 ottobre 2009 - 09:55
madhacker, il 09/10/2009 - 10:32, ha scritto:
genera soltanto un numero, per gli altri restituisce sempre 0
invece non capisco come mai il secondo esempio di metallica restituisca sempre 12 come inizio
Grazie 'madhacker' (che mi sia di lezione, non avere fretta! e provalo prima di postare!)
#18
Inviato 09 ottobre 2009 - 10:03
madhacker, il 09/10/2009 - 10:43, ha scritto:
non esistono in mshell altre funzioni che generano numeri casuali??
Ho notato la stessa cosa...ho pensato che fosse il seme che utilizza il generatore di numeri casuali, in genere viene ricavato da Timer.
Ma questo non spiega perchè se usi math.random() in una shell (Cioè in modo interattivo) non genera questo difetto???.
E perchè i successivi numeri dopo il primo sono realmente casuali.! (Perciò Basterebbe saltare il primo valore.)
Ma questo non fà onore al linguaggio mShell.
#19
Inviato 09 ottobre 2009 - 10:03
use math; cls(); estratti=[] do // sleep(400); numero=(math.random()*10000)%20+1; esistente=false; for i in estratti do if i=numero then esistente=true; end; end; if not esistente then append(estratti,numero); // print numero; end; until len(estratti)=10; print estratti;
@lento: in questo codice invece non lo fa!! quale sarà mai il problema??
Messaggio modificato da madhacker il 09 ottobre 2009 - 10:05
#20
Inviato 09 ottobre 2009 - 10:47
madhacker, il 09/10/2009 - 11:03, ha scritto:
Perfetto ti ringrazio, ritengo che questo è quello che funziona meglio di tutti. In oltre i numeri escono uno di fianco all'altro e non uno al di sotto dell'altro.-
Ora mi chiedevo, mi puoi spiegare gentilmente il perchè in questo in numeri appaiono uno di fianco all'altro e nei precedenti invece appaiono uno al di sotto dell'altro ???
Scusatemi per tutte queste domande.....
Grazie.-

Aiuto













Pubblicità