Newsgroup: it.comp.lang.visual-basic
Titolo: RANDOM

ciao a tutti ho una domanda che è sicuramente banale ma a cui io non
ho saputo trovare una soluzione, avrei bisogno che da una istruzione
randomize mi saltassero fuori dei numeri e fin qui nn c'è problema, ma
non so come fare per far si che il numero già uscito non torni più
fuori, come posso fare?  
ringrazio tutti anticipatamente
Matteo

 fuori, come posso fare?
Memorizzi i numeri già usciti in un array.
Controlli se il numero uscito è presente nell' array.
Se si rilanci la routine.
Bye,
-- 
Carmine ( 
pikachu...@gmail.com
 (Togli la scritta NOSPAM) )
Webmaster di The Total Site 4 : 
http://www.thetotalsite.it
MariokartDS Codice Amico: 532639027909 - CarmineC in MarioKartDS 


Se devi tirare fuori numeri da 1 a N, riempi un vettore con N numeri e
tramite la funzione random tiri fuori un numero casuale relativo ad una
posizione del vettore (quindi random da 1 a N).
A questo punto raccogli il valore della posizione trovata (il numero
casuale che cercavi) e copi il valore dell'ultima posizione del vettore
nell'indice trovato.
Ora devi solo decidere se ridimensionare (con preserve) il vettore ad
N-1 elementi e reiterare la precedente operazione, oppure rieffettuare
la ricerca dell'indice random da 1 a N-1 elementi (di volta in volta
sempre un indice in meno).

 ha scritto nel messaggio 
news:1142238185.8...@i40g2000cwc.googlegroups.com...


 
http://community.visual-basic.it/lucianob/archive/2005/11/22/16591.aspx
Ma scherzi? Usare le collezioni è quanto di più deleterio in termini
di prestazioni, soprattutto per questi problemi abbastanza semplici da
risolvere anche con gli array.

 risolvere anche con gli array.
Non sono d'accordo. A meno di operazioni "time-critical"
la collection e' la candidata ideale a rappresentare
un "sacchetto" di numeri. Una volta popolata/riempita
si puo' estrarre un item fra quelli compresi (1 e Count)
e togliere il numero estratto (Remove).
Le collection inoltre, se usate con criterio, sono assai
performanti.
Just my 2 eurocent,
Lokar

 e togliere il numero estratto (Remove).
Ok, allora prova questo codice (un pò più giu):
Ti dico solo che con i parametri impostati (100000 numeri e 500 da
estrarre), con una collection ci mette 6 secondi e con un'array è
istantaneo (XP 2400 con 256Mb di Ram).
Fai tutte le prove che vuoi e poi dimmi se ancora non sei d'accordo.
:-)
Inoltre si vede perfettamente che utilizzare un vettore o una
collection è praticamente indifferente, a livello di codice: stessa
cosa NON può assolutamente dirsi a livello di prestazioni.
Per concludere, la routine dell'array è ancora perfezionabile, ma
credo che si potrebbero apprezzare miglioramenti delle prestazioni solo
con numeri davvero grandi.
----------------------------------------------------------------------------------------------------------
Private Sub RandomCollection(N As Long, NumeriDaEstrarre As Long)
    Dim collTemp As New Collection
    Dim k As Long
    Dim pos As Long
    Dim valoreEstratto As Long
    'Carica la collection
    For k = 1 To N
        Call collTemp.Add(k)
    Next k
    'Estraggo NumeriDaEstrarre dalla collection
    For k = 1 To NumeriDaEstrarre
        pos = Int((Rnd * collTemp.Count) + 1)
        valoreEstratto = collTemp(pos)
        Call collTemp.Remove(pos)
    Next k
End Sub
Private Sub RandomArray(N As Long, NumeriDaEstrarre As Long)
    Dim arrTemp
    Dim k As Long
    Dim pos As Long
    Dim valoreEstratto As Long
    'Carica la collection
    ReDim arrTemp(N)
    For k = 1 To N
        arrTemp(k) = k
    Next k
    'Estraggo NumeriDaEstrarre dalla collection
    For k = 1 To NumeriDaEstrarre
        pos = Int((Rnd * UBound(arrTemp)) + 1)
        valoreEstratto = arrTemp(pos)
        arrTemp(pos) = arrTemp(UBound(arrTemp))
        ReDim Preserve arrTemp(UBound(arrTemp) - 1)
    Next k
End Sub
Private Sub Command1_Click()
    Debug.Print "RandomColl=" & Now
    Call RandomCollection(100000, 500)
    Debug.Print Now
    Debug.Print "RandomArray=" & Now
    Call RandomArray(100000, 500)
    Debug.Print Now
End Sub
--------------------------------------------------------------------------------------------------

 con numeri davvero grandi.
Esatto, per perfezionarla si può ricorrere ad una tecnica di "shuffle", ossia un
rimescolamento dell'array iniziale.
Dopodiché basta prendere i primi N elementi.
Questo è un riferimento interessante:
http://vbnet.mvps.org/code/helpers/randomarray.htm
Per estrarre 500 numeri da un range di 1 milione un algoritmo simile impiega
meno di 0.5 secondi su un Pentium IV 2.4GHz, 512MB RAM.
Bye
Raf

 rimescolamento dell'array iniziale.
D'accordo in parte, perchè bisogna vedere la bontà e la velocità
dell'algoritmo di shuffle.

 ebbe l'ardore di dire:

Concordo con te. Soprattutto deve essere veloce la routine di Swap.
Però sai che meditando sul tuo algoritmo e togliendo la ReDim Preserve (che non
serve in realtà) ho ottenuto risultati di gran lunga migliori (15ms contro 450)
dello shuffle?
Bye
Raf

 dello shuffle?
Infatti avevo scritto quella versione con il redim preserve solo per
"pigrizia", ma avevo scritto che bastava spostare ogni volta di uno in
meno l'indice finale del vettore.
E' cosi' che hai fatto, no ?
Ciao,
    Fabrizio

 dello shuffle?
Infatti avevo scritto quella versione con il redim preserve solo per


 ebbe l'ardore di dire:

Esattamente!
Ciao.
Raf