6587gianluca Posted October 8, 2009 Report Share Posted October 8, 2009 Ciao ragazzi, con l'avento del nuovo gioco di estrazioni giornaliere denominato Win for life mi è venuto in mente il fatto che il nostro cellulare potrebbe darci una mano a simulare il cervelone della Sisal e generare una serie di 10 numeri a caso che noi potremmo trascrivere sulle schedine e tentare di vincere per la vita una bella somma di soldini che potrebbero esserci più che comodi visti i tempi di crisi in cui ci troviamo. 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 !!!!!!!!!!!!!!!!!!!! Link to comment Share on other sites More sharing options...
xMetallicax Posted October 8, 2009 Report Share Posted October 8, 2009 (edited) Certo che farsi suggerire i numeri da una macchina... mah... 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 Edited October 9, 2009 by xMetallicax Link to comment Share on other sites More sharing options...
madhacker Posted October 8, 2009 Report Share Posted October 8, 2009 in mshell ora non saprei dirtelo, ma in python è abbastanza semplice 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 Link to comment Share on other sites More sharing options...
lento Posted October 8, 2009 Report Share Posted October 8, 2009 Comunque ecco qui il codice, non testato perchè ho il cell in assistenza . 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 ho fatto quello che tu non ai potuto fare Testare i programmi. Link to comment Share on other sites More sharing options...
xMetallicax Posted October 8, 2009 Report Share Posted October 8, 2009 eheh è vero mi ero dimenticato ho corretto il post grazie lento Link to comment Share on other sites More sharing options...
6587gianluca Posted October 8, 2009 Author Report Share Posted October 8, 2009 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.- Link to comment Share on other sites More sharing options...
madhacker Posted October 8, 2009 Report Share Posted October 8, 2009 però lo script genera soltanto numeri da 1 a 20 e non calcola se essi sono già stati inseriti Link to comment Share on other sites More sharing options...
lento Posted October 8, 2009 Report Share Posted October 8, 2009 però lo script genera soltanto numeri da 1 a 20 e non calcola se essi sono già stati inseriti Perchè questo favellar maligno esce dalla tua bocca? Donde sorge siffatta idea? Link to comment Share on other sites More sharing options...
madhacker Posted October 8, 2009 Report Share Posted October 8, 2009 (edited) 1) perchè eseguendolo 10 volte i numeri stampati sul video sono compresi tra 1 e 20 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 wfl.zip Edited October 8, 2009 by madhacker Link to comment Share on other sites More sharing options...
lento Posted October 8, 2009 Report Share Posted October 8, 2009 1) perchè eseguendolo 10 volte i numeri stampati sul video sono compresi tra 1 e 202) 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...... Link to comment Share on other sites More sharing options...
madhacker Posted October 9, 2009 Report Share Posted October 9, 2009 (edited) errore di lettura mio... avevo scambiato il 20 con il 90 (come si evince anche dal codice che ho postato più su) 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 Edited October 9, 2009 by madhacker Link to comment Share on other sites More sharing options...
lento Posted October 9, 2009 Report Share Posted October 9, 2009 (edited) 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. Edited October 9, 2009 by lento Link to comment Share on other sites More sharing options...
madhacker Posted October 9, 2009 Report Share Posted October 9, 2009 (edited) ehm... la tua ultima personalizzazione ha qualcosa che non va... 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 Edited October 9, 2009 by madhacker Link to comment Share on other sites More sharing options...
lento Posted October 9, 2009 Report Share Posted October 9, 2009 questo codice non ritorna numeri "doppioni", ma, come quello di metallica, inizia sempre per 12!! Ottima la tua revisione di 'metallica' ma....Che spiegazione dai a questo fatto??? è un problema di math.random() ?? @'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() ) Link to comment Share on other sites More sharing options...
madhacker Posted October 9, 2009 Report Share Posted October 9, 2009 ho notato una cosa, alquanto spiacevole... il primo numero varia con l'aumentare dei minuti... se fai prove per più di un minuto, ti rendi conto che dopo un tot di tempo, il primo numero incrementa di 1 non esistono in mshell altre funzioni che generano numeri casuali?? Link to comment Share on other sites More sharing options...
6587gianluca Posted October 9, 2009 Author Report Share Posted October 9, 2009 ho notato una cosa, alquanto spiacevole... il primo numero varia con l'aumentare dei minuti... se fai prove per più di un minuto, ti rendi conto che dopo un tot di tempo, il primo numero incrementa di 1 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 Link to comment Share on other sites More sharing options...
lento Posted October 9, 2009 Report Share Posted October 9, 2009 ehm... la tua ultima personalizzazione ha qualcosa che non va...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!) Link to comment Share on other sites More sharing options...
lento Posted October 9, 2009 Report Share Posted October 9, 2009 ho notato una cosa, alquanto spiacevole... il primo numero varia con l'aumentare dei minuti... se fai prove per più di un minuto, ti rendi conto che dopo un tot di tempo, il primo numero incrementa di 1 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. Link to comment Share on other sites More sharing options...
madhacker Posted October 9, 2009 Report Share Posted October 9, 2009 (edited) @gianluca: ecco il tuo codice "rivisitato" con il controllo dei doppioni, ed in più ho cambiato %10 con %20 in quanto generasse i numeri da 1 a 20 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?? Edited October 9, 2009 by madhacker Link to comment Share on other sites More sharing options...
6587gianluca Posted October 9, 2009 Author Report Share Posted October 9, 2009 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.- Link to comment Share on other sites More sharing options...
lento Posted October 9, 2009 Report Share Posted October 9, 2009 @lento: in questo codice invece non lo fa!! quale sarà mai il problema?? La risposta la trovi nell'esecuzione di questo programmino. use math as m, array as a, time; cls(); estratti=[0,0,0,0,0,0,0,0,0,0]; for i=0 to 9 do do numero=m.random(); until a.index(estratti,numero)=-1; estratti[i]=numero; end for i in estratti do print i; end Ti accorgerai che il primo numero generato è realmente casuale se consideri più di due cifre decimali. (Detta tra noi non è che sia propri casuale ste funzione!) se usi quanto sin ora da mè utilizzato nei miei programmi function acaso(da,ad) /*-------------------- calcola numeri casuali dal valore minimo (da) al valore massimo (ad) compresi */ a=math.random()*10000; return (a%ad)+da; end; Riesci ad ottenere una buona qualità (meglio se 10000 ha ancora piu zeri) altrimenti se vuoi usare numero=m.trunc(m.random()*20+1); devi almeno saltare i primi due-tre decimali. Link to comment Share on other sites More sharing options...
madhacker Posted October 9, 2009 Report Share Posted October 9, 2009 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.- perchè negli altri esempi, veniva usato for i in estratti do print i; end ovvero la stampa dei singoli valori mentre ora print estratti; stampa tutto l'array (comprensivo di parentesi quadre). @ lento: partendo dal presupposto che la macchina non sa MAI generare un numero casuale, quindi ogni linguaggio sceglie come meglio crede il parametro base da cui partire; taluni partono dalla funzione time altri da un misterioso calcolo dei vari componenti hardware e chissà quante altre funzioni "casuali" esistono, ma il punto di base è che la macchina POTREBBE sapere già che numero casuale genera Link to comment Share on other sites More sharing options...
xMetallicax Posted October 9, 2009 Report Share Posted October 9, 2009 scusate... c'è un problema nel mio secondo codice, manca l'istruzione array.remove() (che correggerò ora ) i numeri vengono generati in base all'orario del telefono (non sono quindi completamente casuali ) come per il visual basic se non sbaglio li genera in base ad un registro contatore che si trova nel processore per il problema che i numeri sono simili fra loro a distanza di poco tempo... beh ve lo spiegherò oggi pomeriggio con tanto di codice Link to comment Share on other sites More sharing options...
lento Posted October 9, 2009 Report Share Posted October 9, 2009 (edited) Come dice Alter E' mò che fai?? te metti a frignà ......ma fatte na bella random personal! Perchè nò facciamoci una funzione random() che ci soddisfi (Uè nulla di trascendentale..intendiamoci.) use math as m, array as a, time; cls(); estratti=[0,0,0,0,0,0,0,0,0,0]; function ribalta(sn) // ribalta il numero tipo: "Gli ultimi saranno i primi.." ribaltato=""; for i=.len(sn)-1 to 4 by -1 do if substr(sn,i,1)<>"." then ribaltato=ribaltato+substr(sn,i,1); end; end; return num(ribaltato); end; seme=ribalta(str(time.get(),1,4)) / 100000000000; // Genero il seme per calcolo numeri casuali function random() // ad ogni chiamata genera numero casuale numero=147*.seme; .seme=numero -math.trunc(numero); return .seme; end; // qui comincia il programmino per generare 10 numeri casuali su 20. for i=0 to 9 do do numero=m.trunc(random()*20+1); until a.index(estratti,numero)=-1; estratti[i]=numero; end for i in estratti do print i; end Provare per credere....aggiungo il sorgente per comodità.Ran3.txt I numeri generati dovrebbero essere sufficientemente casuali per usi generici. Edited October 9, 2009 by lento Link to comment Share on other sites More sharing options...
madhacker Posted October 9, 2009 Report Share Posted October 9, 2009 (edited) @metallica: i numeri NON sono simili fra loro nell'arco di poco tempo, ma bensì il PRIMO numero è SEMPRE uguale nell'arco di poco tempo (30 sec più o meno) questo è riferito però soltanto al codice da te postato, mentre con quello di gianluca che ho sistemato non si verifica. Edited October 9, 2009 by madhacker Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now