Nokioteca [Nokia] Forum: Programma Estrazioni Win For Life - Nokioteca [Nokia] Forum

Salta al contenuto

  • 5 Pagine +
  • 1
  • 2
  • 3
  • Ultimo »
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

Programma Estrazioni Win For Life lo vogliamo realizzare ????

#1 L   6587gianluca 

  • Advanced Member
  • PuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 213
  • Iscritto: 31 dicembre 2006
  • Cellulare:Nokia C7

Inviato 08 ottobre 2009 - 10:10

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 !!!!!!!!!!!!!!!!!!!!
0

#2 L   xMetallicax 

  • Senior Member
  • Gruppo: Developer
  • Messaggi: 953
  • Iscritto: 24 luglio 2006
  • Località:Saporito (CS)
  • Cellulare:6720
  • Firmware:031.022

Inviato 08 ottobre 2009 - 13:44

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

Messaggio modificato da xMetallicax il 09 ottobre 2009 - 12:48

0

#3 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 08 ottobre 2009 - 14:44

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

0

#4 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 08 ottobre 2009 - 17:33

Visualizza MessaggixMetallicax, il 08/10/2009 - 14:44, ha scritto:

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.
0

#5 L   xMetallicax 

  • Senior Member
  • Gruppo: Developer
  • Messaggi: 953
  • Iscritto: 24 luglio 2006
  • Località:Saporito (CS)
  • Cellulare:6720
  • Firmware:031.022

Inviato 08 ottobre 2009 - 17:41

eheh è vero :(
mi ero dimenticato :(
ho corretto il post
grazie lento ;)
0

#6 L   6587gianluca 

  • Advanced Member
  • PuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 213
  • Iscritto: 31 dicembre 2006
  • Cellulare:Nokia C7

Inviato 08 ottobre 2009 - 18:11

Visualizza MessaggixMetallicax, 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.-
0

#7 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 08 ottobre 2009 - 18:46

però lo script genera soltanto numeri da 1 a 20 e non calcola se essi sono già stati inseriti
0

#8 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 08 ottobre 2009 - 19:25

Visualizza Messaggimadhacker, il 08/10/2009 - 19:46, ha scritto:

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?
0

#9 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 08 ottobre 2009 - 20:25

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

Download file

  • Download file  wfl.zip (64,79K)
    Numero di downloads: 22

Messaggio modificato da madhacker il 08 ottobre 2009 - 20:28

0

#10 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 08 ottobre 2009 - 21:34

Visualizza Messaggimadhacker, il 08/10/2009 - 21:25, ha scritto:

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......
0

#11 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 09 ottobre 2009 - 08:42

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

Messaggio modificato da madhacker il 09 ottobre 2009 - 09:06

0

#12 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

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

0

#13 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 09 ottobre 2009 - 09:32

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

Messaggio modificato da madhacker il 09 ottobre 2009 - 09:33

0

#14 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 09 ottobre 2009 - 09:39

Visualizza Messaggimadhacker, il 09/10/2009 - 09:42, ha scritto:

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() )
0

#15 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 09 ottobre 2009 - 09:43

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??
0

#16 L   6587gianluca 

  • Advanced Member
  • PuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 213
  • Iscritto: 31 dicembre 2006
  • Cellulare:Nokia C7

Inviato 09 ottobre 2009 - 09:54

Visualizza Messaggimadhacker, il 09/10/2009 - 10:43, ha scritto:

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
0

#17 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 09 ottobre 2009 - 09:55

Visualizza Messaggimadhacker, il 09/10/2009 - 10:32, ha scritto:

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!)
0

#18 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 09 ottobre 2009 - 10:03

Visualizza Messaggimadhacker, il 09/10/2009 - 10:43, ha scritto:

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.
0

#19 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 09 ottobre 2009 - 10:03

@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??

Messaggio modificato da madhacker il 09 ottobre 2009 - 10:05

0

#20 L   6587gianluca 

  • Advanced Member
  • PuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 213
  • Iscritto: 31 dicembre 2006
  • Cellulare:Nokia C7

Inviato 09 ottobre 2009 - 10:47

Visualizza Messaggimadhacker, 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.-
0

Condividi questa discussione:


  • 5 Pagine +
  • 1
  • 2
  • 3
  • Ultimo »
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione