Re: Fortran e i numeri casuali

From: Roberto Rosoni <roberto.rosoni_at_liberoLock.it>
Date: Mon, 24 Feb 2003 20:35:40 +0100

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

This archive was generated by hypermail 2.3.0 : Fri Nov 08 2024 - 05:10:30 CET