Antonio Uras, in data Sat, 22 Feb 2003 19:43:30 GMT, ha scritto in
"it.scienza.fisica" nel thread "Fortran e i numeri casuali":
> come si fa a generare in fortran delle serie di numeri random
> (pseudo-random) che non siano sempre uguali?
[...]
> Ora, io ho usato per generare i miei numeri l'istruzione
> RAND( )
> lasciando vuoto l'argomento.
> Non conosco bene le potenzialit� di questa istruzione (l'ho scoperta per
> caso, tanto si chiamano sempre allo stesso modo), n� so se ve ne siano di
> altre pi� adatte allo scopo (spero proprio di s�!). Mi rimetto dunque alle
> vostre indicazioni, che spero arrivino numerose :)
Io programmavo in FORTRAN 77 (con estensioni Digital VMS) molti anni fa, e
non conosco gli attuali sviluppi, e purtroppo i listati sono in cantina (o
nella pancia di qualche roditore).
Comunque facevo come ora ti descriver�, ma devi verificare sul manuale che
la tua RAND si comporti come faceva la mia: so che � una funzione molto
dipendente dalla specifica implementazione del compilatore
..
Il trucco � proprio quello di "riempire" l'argomento, di solito chiamato
ISEED di tipo INTEGER*4. Mi ricordo che il manuale diceva che ISEED poteva
essere un qualunque intero grande dispari. Ogni qualvolta chiami
F=RAND(ISEED) oltre al valore in F viene modificato il valore ISEED con un
nuovo numero che sar� la base per calcolare il successivo random alla
prossima chiamata.
In pratica ad inizio programma prendevo dall'orologio di sistema il numero
di secondi trascorsi dalla mezzanotte (0<=IT<�399), lo moltiplicavo per
24800, e aggiungevo 1. Questa costante � calcolata in modo da ottenere il
grande numero dispari che per� non vada mai in overflow.
Poi, facevo girare un po' di volte il generatore a vuoto e opl�, numeri
random sempre diversi!
Pi� o meno:
INTEGER*4 ISEED, IT, I, J
REAL DUMMY, RN
IT = ITIME() ;QUESTA FUNZIONE RESTITUISCE I SECONDI DALLA MEZZANOTTE
ISEED = IT*24800+1 ; ECCO UN GRANDE NUMERO DISPARI
DO 1 J=1,10000 ; UN'ULTERIORE RIMESCOLATA AI DADI
DUMMY = RAND(ISEED)
1 CONTINUE
DO 2 I= quello che ti pare ;QUESTO E' IL TUO PROGRAMMA
RN=RAND(ISEED) ;E RN E' IL TUO NUMERO CASUALE
2 CONTINUE
END
Ripeto, devi cercare una funzione tempo del tuo compilatore ed adattare il
preriempimento di ISEED. Nota che una volta precaricato non devi pi�
toccarlo: ci pensa la funzione a modificarselo.
Ciao, e grazie di avermi dato l'occasione di riprendere in mano per un
attimo il mio grande amore di giovent�...
--
Roberto Rosoni
<roberto.rosoni_at_liberoLock.it> (Remove the Lock in your replies)
Programmatore: chi ti risolve, in modo incomprensibile, un problema che non sapevi di avere.
Received on Mon Feb 24 2003 - 20:35:40 CET