Jump to content
Nokioteca Forum

Programma Estrazioni Win For Life


6587gianluca
 Share

Recommended Posts

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

  • Replies 85
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

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 :mumble:.

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 by xMetallicax
Link to comment
Share on other sites

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

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

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

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 by madhacker
Link to comment
Share on other sites

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 :)

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

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 :D

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 by madhacker
Link to comment
Share on other sites

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 by lento
Link to comment
Share on other sites

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 :D

Edited by madhacker
Link to comment
Share on other sites

questo codice non ritorna numeri "doppioni", ma, come quello di metallica, inizia sempre per 12!!

Ottima la tua revisione di 'metallica' :D 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

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 :D

non esistono in mshell altre funzioni che generano numeri casuali??

Link to comment
Share on other sites

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 :blink:

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

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 :blink:

Grazie 'madhacker' (che mi sia di lezione, non avere fretta! e provalo prima di postare!)

Link to comment
Share on other sites

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 :blink:

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

@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 :blink:

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 by madhacker
Link to comment
Share on other sites

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

@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

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 :crying_anim02:

Link to comment
Share on other sites

scusate... c'è un problema nel mio secondo codice, manca l'istruzione array.remove() (che correggerò ora :speak_cool:)

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

Come dice Alter E' mò che fai?? te metti a frignà :speak_cool: ......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 by lento
Link to comment
Share on other sites

@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 by madhacker
Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share


×
×
  • Create New...

Important Information

Questo sito utilizza i cookie per analisi, contenuti personalizzati e pubblicità. Continuando la navigazione, accetti l'utilizzo dei cookie da parte nostra | Privacy Policy