Newsgroup: it.comp.appl.access
Titolo: RND ripetitivo

Nel corso di un ciclo
 for ....next
la funzione RND mi genera un numero casuale che poi utilizzo .
Come faccio per evitare che generi più volte lo stesso numero?
Ho fatto delle prove e se l'intervallo di numeri è piccolo la probabilità
che questo avvenga è molto alta
Grazie ... mi avete più volte salvato...

Quanti Numeri devi controllare.
Li memorizzi in una matrice e controlli se il numero è già uscito ciao.

che questo avvenga è molto alta
Tutto cio' mi sembra molto strano. Potresti postare il codice che usi?
Prova a mettere un'istruzione Randomize, senza parametri, prima di
generare ogni numero. In questo modo il generatore viene
reinizializzato ogni volta usando il timer come "seme" della
procedura, e quindi la sequenza sara' molto probabilmente diversa ogni
volta. Questo in ogni caso andava fatto con i vecchi interpreti Basic
della Microsoft, mi sembra strano che tu riesca ad estrarre due volte
lo stesso numero a singola precisione in una breve sequenza.
Ciao,
G.


   Gli algoritmi di generazione dei numeri casuali sono in grado, in
realta', di generare solo sequenze di numeri pseudo-casuali. Cio' significa
che tutti i numeri estratti sono scorrelati tra loro (+ o -)  o che, per
dirlo in altri termini, la distribuzione statistica dei numeri estratti e'
costante all'interno dell'intervallo di estrazione (solitamente [0, 1[ ).
   I piu' usati (e semplici) algoritmi di generazione di numeri
pseudo-casuali iniziano a costruire la serie numerica a partire da un numero
(un parametro) chiamato base. Ad ogni base è associata una determinata
sequenza numerica (stessa base --> stessa sequenza); i numeri appartenenti a
questa sequenza sono tra loro scorrelati (in realta' le serie sono
periodiche anche se il periodo e' molto lungo... ma questa e' un'altra
storia).
  Dunque, concludendo, per avere nel tuo prog. VB una serie di numeri
(pseudo)casuali sempre diversa, dovrai inizializzare l'algoritmo utilizzando
ogni volta una base diversa. A questo punto ti vengono in aiuto l'help in
linea e l'istruzione Randomize. Copio ed incollo:
_RANDOMIZE_
Inizializza il generatore di numeri casuali.
_Sintassi_
Randomize [numero]
L'argomento facoltativo numero può essere un valoreVariant o una
qualsiasiespressione numerica valida.
_Osservazioni_
Randomize utilizza numero per inizializzare il generatore di numeri casuali
della funzione Rnd assegnandogli un nuovo valorebase. Se numero viene
omesso, il valore restituito dal timer di sistema verrà utilizzato come
nuova base.
Se Randomize non viene utilizzata, quando la funzione Rnd (senza argomenti)
viene chiamata per la prima volta, utilizza come base lo stesso numero. Per
le chiamate successive la funzione utilizzerà l'ultimo numero generato.
_Nota_   Per ripetere sequenze di numeri casuali, richiamare Rnd con un
argomento negativo immediatamente prima di utilizzare Randomize con un
argomento numerico. L'utilizzo di Randomize con lo stesso valore di numero
non determinerà la ripetizione della sequenza precedente.
  Ciao.

Come faccio per evitare che generi più volte lo stesso numero?
Con un vettore.
Se n deve essere fra 0 e 20, ti fai un vettore di 20 elementi bool
settati a false, e mano a mano che li trovi, li switchi.
Se ti viene un numero gia' uscito, fai un altro giro.
Bai
--
Lorenzo Coronati
--
<<Nessuno sa che questa affermazione e' vera>>
(John D. Barrow)
--

 che questo avvenga è molto alta
Spiega esattamente a cosa ti serve la sequenza (pseudo)casuale, perchè
spesso ci sono vie alternative.
--
Ciao, AntoGal
*************************************************
Home Page (area programmatori di VolFtp)
http://volftp.mondadori.com/italiani/galletta/
per scaricare un gioco di DAMA ITALIANA
*************************************************

 Se ti viene un numero gia' uscito, fai un altro giro.
ciao Lore', un piccolo miglioramento potrebbe essere:
Hai un array di 100 elementi, ne vuoi estrarre 20 random, senza ripetizioni
e col minor numero di cicli.
- Genera un numero tra 1 e 100 ed estrai il corrispondente elemento.
- COPIA l'ultimo elemento (100) al POSTO di quello estratto
- Genera un numero tra 0 e 99 (questo garantisce l'univocità e la lettura
immediata del valore)
- continua copiando di volta in volta l'ultimo elemento al posto di quello
uscito e decrementa il limite superiore del range dei numeri random.
Questo ti evita di spostare blocchi di elementi, usare dei flag, e pescare
un numero valido ad ogni estrazione.


ciao Lore', un piccolo miglioramento potrebbe essere:
Ingegnoso.
Antonello non ci delude mai ;-))))



okkio: e' vero che cambiando il numero iniziale con RANDOMIZE la sequenza
pseudocasuale ottenuta contiene numeri tutti diversi da quelli di un'altra
sequenza che parte da un numero diverso, ma ciò vale solo per le sequenze
"originali", ossia ad es. fatte di interi tra 0 e (2alla31)-1 supponendo ad
es. un metodo moltiplicativo congruenziale, non per le sequenze ridotte
sull'intervallo che vuole l'utente, che può anche essere piccolo e limitato
a numeri interi, e in questo caso numeri pseudocasuali diversi nella
sequenza "originale" possono benissimo diventare lo stesso numero nella
sequenza voluta; lo stesso vale per numeri di due sequenze "originali"
diverse. L'unica e' appunto, come molti hanno già detto, scartare i numeri
che si ripetono.
In realtà da quello che dice C.Briglia si direbbe che voglia semplicemente
una "disposizione" (in senso combinatorio) di tutti i valori possibili, per
cui in effetti esistono delle routines, ma abbastanza complicate... e quindi
conviene appunto usare il sistema suddetto (premettere RANDOMIZE se no e'
possibile che ad ogni riavvio del pgm esca sempre la stessa sequenza)
barbi