154 messaggi dal 21 maggio 2001
Ciao ragazzi,
un consiglio su come risolvere una cosa!

In modo casuale una funzione deve restituirmi un numero compreso da 1 a 50.Quindi faccio cosi :


.....
Randomize()
Numero = CInt(Rnd()*50)
.......


E quindi con questo codice l'applicazione mi tira fuori sempre un numero random compreso da 1 a 50 !

Il problema che non vorrei farmi ritornare uno stesso numero già uscito , per esempio se mi sono usciti i numeri :
1,2,3,5,6,7,8,9, ecc ecc

con quella funzione spesso mi tira fuori numeri già usciti, invece io gli vorrei far randomizare solo i numeri restanti.

Qualche consiglio?
Grazie...
2.410 messaggi dal 13 febbraio 2003
Contributi
"cingianni"

Ciao ragazzi,

ciao

un consiglio su come risolvere una cosa!

In modo casuale una funzione deve restituirmi un numero compreso da 1 a 50.Quindi faccio cosi :

.....
Randomize()
Numero = CInt(Rnd()*50)
......


E quindi con questo codice l'applicazione mi tira fuori sempre un numero random compreso da 1 a 50 !

Il problema che non vorrei farmi ritornare uno stesso numero già uscito , per esempio se mi sono usciti i numeri :
1,2,3,5,6,7,8,9, ecc ecc

con quella funzione spesso mi tira fuori numeri già usciti, invece io gli vorrei far randomizare solo i numeri restanti.

Qualche consiglio?

Qui trovi un buon esempio in vbscript, buona lettura
http://www.freevbcode.com/ShowCode.asp?ID=7399
62 messaggi dal 14 febbraio 2001
www.frisullo.it
dipende da quante estrazioni vuoi fare...

supponiamo tu voglia fare 10 estrazioni (dipendenti), ti costruisci un array di dimensione Casual_Array(10), e lo inizializzi con valore -1.

Cominci le iterazioni di estrazione, e ad ogni iterazione controlli che fino a quel momento non sia stato estratto lo stesso numero ed inserisci il numero nell'array...altrimenti ripeti l'estrazione...


Dim Casual_Array(10)
FOR I = 0 TO 9
Casual_Array(I) = -1
NEXT

Randomize()
FOR I = 0 TO 9
Numero_Estratto = CInt(Rnd()*50)

Duplicato_estrazione = False
FOR J=0 TO 9 ' l'array conterrà al più le estrazioni "valide"
IF (Casual_Array(J) = Numero_Estratto) THEN
Duplicato_estrazione = True
EXIT FOR
END IF
NEXT

IF Duplicato_estrazione THEN
I = I - 1 ' ripeti l'estrazione
ELSE
Casual_Array(I) = Numero_Estratto
Response.Write Numero_Estratto & "<br>"
END IF

NEXT

dovrebbe funzionare....l'ho scritta senza provare...e potrebbe non essere la soluzione più "fine"...

ciao
Lucio

Lucio
154 messaggi dal 21 maggio 2001
adesso provo poi vi faccio sapere ...
cmq i numeri da estrarrere sono da 1 a 50 quindi 50 estrazioni
Come la tombola .....

grazie 1000
154 messaggi dal 21 maggio 2001
diciamo che questo codice che hai scritto non lo provato ma ne ho fatto uno simile è funziona !
Però il problema rimane sempre , cioè randominza sempre tutti i numeri e non soltanto quelli che non sono ancora usciti!
Quindi perde prestazioni l'applicazione.
593 messaggi dal 09 ottobre 2002
www.dotnetside.org
Se è così, io suggerirei qualcosa del genere:

- Ti crei una stringa di 50 numeri da 1 a 50 separati da virgola che assegnerai per esempio ad una variabile session che utilizzeray come una sorta di array;

- Estrai uno dei numeri contenuti nella stringa mediante randomizzazione dell'indice massimo dell'array predetto;

- contestualmente, elimini l'elemento dalla stringa array.

In questo modo hai il duplice vantaggio di evitare confronti e di essere certo che gli ulteriori numeri estratti lo siano solo all'interno dei residui un po' come se, estratto il numero dal sacchetto della tombola, esso viene eliminato e si procede soltanto all'estrazione di quelli che rimangono nel sacchetto.

Ciao

Pochi post. Anzi, quasi quasi spengo
http://www.dotnetside.org/
62 messaggi dal 14 febbraio 2001
www.frisullo.it
Ho modificato la funzione in questo modo...quella di ieri era poco "fine".

Evitare completamente il controllo sull'estrazione duplicato non credo sia possibile...ma ciclare sul vettore si può evitare...

così, molto vicino alla soluzione di Vitosulla con la stringa, che però ad ogni estrazione richiede di essere modificata e di ricreare un array che delimita i valori possibili (se ho capito bene), ti proporrei di utilizzare un array booleano dimensionato al numero di estrazioni da fare e inzializzato a False...il numero estratto corrisponde alla cella...e se False (non ancora estratto) consideriamo il numero valido e si setta la cella a True...altrimenti si ripete l'estrazione...

questa potrebbe andare bene

...non ha errori di sintassi ho già provato..
<%
Numero_Estrazioni = 10
Numero_Max = 50 ' consideriamo l'intervallo da [0, 50]

Dim Casual_Array(50)
FOR I = 0 TO (Numero_Max - 1)
Casual_Array(I) = False
NEXT

Randomize()
FOR I = 1 TO Numero_Estrazioni
Numero_Estratto = CInt(Rnd()*Numero_Max)

IF Casual_Array(Numero_Estratto) THEN ' valore già estratto
I = I - 1 ' ripeti l'estrazione
ELSE
Casual_Array(Numero_Estratto) = True
Response.Write Numero_Estratto & "<br>"
END IF
NEXT
%>


Credo però che poi dipenda dalla situazione, trovare un giusto compromesso...

1) se occorre fare poche estrazioni e l'intervallo da cui "prendere" è ampio...(bisognerebbe dichiarare e dimensionare un array troppo grande) ...allora è preferibile la soluzione che cicla...
2) se l'intevallo è piccolo allora è preferibile quella dell'array booleano..

rileggerò qualcosa riguardo a queste semplici operazioni che però....


ciao
Lucio

Lucio
154 messaggi dal 21 maggio 2001
Ciao Lucio , guarda ho provato il tuo codice e sembra che funziona molto bene !  Faccio qualche test e ti faccio sapere cmq ti ringrazio per l'interessamento   , hai un  pagato...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.