Newsgroup: it.comp.programmare
Titolo: routin numeri casuali

Scusate , magari sto chiedendo una cosa che richiede un po' di tempo,
ma volevo sapere se qualcuno mi potesse scrivere una routin per creare una
serie di numeri casuali.
potete scriverla in Tpascal o anche in un linguaggio comune (se a = b allora
c e' vero)
Avrei bisogno di usarla per inserirla in alcuni esercizi che sto facendo in
cobol.
Sfigatamente non sono riuscito a costruirmi il flow (probabile lacuna
matematica)
--
ciao e grazie
/
suppo
by Fabrizio
"i sogni son desideri...."

Ciao,
puoi usare questa (che non e' raffinatissima ma non e' male):
subroutine ranig(s,r)
	implicit double precision (a-h,o-z)
	b = .1048581d+07
	c = .34359738368d+11
	s = dmod(s*b + 1.d0, c)
        r=s/c
        return
        end
questa e' scritta in Fortran ma puoi facilmente adattarla. Per farla
funzionare, inizializzala con un valore s grande (io uso
2.d0**35.d0*.625100725312354d0) e poi continua a passarle il valore di s
che restituisce. Il valore random che ti serve e' in r (che va da 0 a
1).
Ciao,
Massimo
--
Massimo Vassalli
Istituto Nazionale di Ottica Applicata
Laboratorio di Biofotonica
mas...@ino.it
--

 1).
ehm, io il fortran non lo conosco, dovresti spiegarmi il significato delle
parole chiave, anche xche'
non sono un matematico
= e' identico sia x l'assegnazione che x le costanti?
return - indica la ripetizione del ciclo, da dove.?
s= - non ho capito nulla
mod - sta ad indicare la restituzione del resto di una divisione?
In questa maniera riesco a produrre una funzione da cui posso scegliere
l'intervallo? es (1 - 100)


 >         end
triste sintassi Fortran per concludere la funzione (che in effetti e'
una subroutine, non propriamente una funzione).


 una subroutine, non propriamente una funzione).
Quello che dici tu e' molto interessante, ma il problema, e' che la devo
realizzare in cobol,
ho bisogno di utilizzare delle operazioni + semplici.
Quello che ti chiedo e', se riesci a modificare questa routin, dividendola
in + operazioni.
Forse quello che m'incasina maggiormente e' la doppia precisione.
Il mod dovrebbe essere = a quello del turbopascal e che in cobol si traduce:
DIVIDE var1 BY var2 GIVING var3 REMAINDER resto
Questo per darti un esempio di quello che dovrei scrivere per fare quello
che hai fatto tu in fortran.
Se riuscissi a semplificarla anche un po', mi faresti un gran favore.


Ciao,
riprovo ad essere piu' chiaro:
innanzi tutto la doppia precisione: si tratta della dichiarazione delle
variabili. In sostanza devi dichiarare s ed r in maniera che siano
decimali con la piu' alta precisione possibile. a fronte di cio',
supponiamo che la tua funzione si chiami ranig (come la mia). Entrando
nella funzione con un numero, s, te ne restituisce due uno che e' r, tra
0 e 1, e uno che e' s che dovrai usare la prossima volta che entrerai
nella funzione per generare i numeri casuali. Cosi' facendo, se prendi
tutti i numeri r che ottieni entrando e rientrando nella funzione,
ottieni un set di numeri distribuiti fra 0 e 1 in maniera "casuale". Ti
basta poi moltiplicare ogni numero per il valore massimo che vuoi
ottenere e ci sei. Unica cosa che manca: l'inizializzazione ! Un
qualsiasi generatore di numeri casuali genera in effetti un set di
numeri "il meno possibile" correlati tra loro e per ogni numero iniziale
esiste uno ed un solo set di questo tipo. Per "selezionare" il set, devi
usare un numero da te impostato. Se vuoi che sia diverso ogni volta che
lanci il programma, puoi effettivamente usare il tempo attuale (questo
fa la funzione randomize che spesso e' presente nei compilatori).
Siamo d'accordo su quanto sopra ?
Se siamo d'accordo, la struttura non dovrebbe piu' esserti oscura:
nella routine principale del programma definisci s e r come numeri
decimali con la massima precisione possibile e assegni ad s un numero
grande a partire dal tempo attuale (ad esempio il numero di secondi tra
l'istante in cui gira il programma e il primo gennaio 1900, cosi' testi
anche il bug Y2K). Ad r dai il valore 0, inizialmente. Ora chiami la
funzione ranig incriminata dandole in ingresso s e ti fai restituire
(nella sintassi del cobol che non conosco) sia r che s. r contiene il
tuo numero tra 0 e 1 e s la usi la volta successiva che chiami la ranig
nello stesso programma.
A questo punto manca la funzione:
definisci due costanti, a e b, come sempre con la massima precisione
possibile, e assegni loro il valore del mail precedente. A questo punto,
semplicemente facendo l'operazione di modulo (che equivale a prendere il
resto nell'operazione da te descritta) e ci sei.
Ti torna ?


 decimali con la piu' alta precisione possibile.
Tutto chiaro, sono io che sono un po' tardo, scusami.
Xo' mi spieghi cosa intendi per precisione?
Di quanti caratteri dev'essere composto un numero decimale per essere
preciso.
Nel cobol lo devo specificare, e' questo il problema.
Non mi basta dirgli il tipo di dato, ma lo devo definire nella sua
lunghezza.
(ripeto, non sono un matematico, devi avere pazienza).


 (ripeto, non sono un matematico, devi avere pazienza).
Nessun problema per la pazienza.
Ciao e buon lavoro.
