Pagina 1 di 1

[C] generazione di numeri casuali

Inviato: mer 16 gen 2008, 23:41
da ccts2002
ciao a tutti!!!!
per la tesi mi trovo a sviluppare un programmino in c/c++ (e per alcune cose vi ho già chiesto....) che in una sua parte presuppone la generazione di numeri casuali...sto usando la funzione rand(), ma googlando ho trovato questo codice:

Codice: Seleziona tutto

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define S1MAX 2147483562
#define S2MAX 2147483398

float Rand(void);
void Srand(void);

long s1,s2;

int main(void)

{
    int i;

    Srand();
    
    for(i=0;i<256;i++)
        printf("%7.2f\n",Rand());
}

void Srand(void)

{
    time_t t;

    s1=(unsigned)time(&t);
    s2=s1*s1;

    if(s1<1||s1>S1MAX)
	s1=(abs(s1)%S1MAX)+1;
    if(s2<1||s2>S2MAX)
	s2=(abs(s2)%S2MAX)+1;

}

float Rand()

{
    long Z,k;

    k=s1/53668;
    s1=40014*(s1-k*53668)-k*12211;
    if(s1<0)
	s1+=S1MAX+1;

    k=s2/52774;
    s2=40692*(s2-k*52774)-k*3791;
    if(s2<0)
	s2+=S2MAX+1;

    Z=s1-s2;
    if(Z<1)
	Z+=S1MAX;

    return(Z*4.656613E-10);
}
qualcuno di voi me lo sa spiegare? inizializza s1 e s2 partendo dall'indirizzo di t...perché? non è un indirizzo come un altro? o è invece l'ora attuale?
e poi...la parte:

Codice: Seleziona tutto

 k=s1/53668;
    s1=40014*(s1-k*53668)-k*12211;
perché non fa sempre -k*12211? e tra quali valori è compreso il valore ritornato? dai risultati che da mi sembra 0 e 1...giusto?
grazie mille!!!!

Re: [C] generazione di numeri casuali

Inviato: gio 17 gen 2008, 10:25
da Blizzard
ciao,

il codice fa parecchi pastrocchi! che sinceramente non ho compreso in termini matematici :p
inizializza s1 e s2 partendo dall'indirizzo di t...perché? non è un indirizzo come un altro? o è invece l'ora attuale?
in realtà assegna alla variabile s1 il risultato della funzione time. Il man la definisce tale:
time() returns the time since the Epoch (00:00:00 UTC, January 1,
1970), measured in seconds.
Tuttavia la assegna ad un long facendo il cast ad unsigned. Il che significa che prende quel dato e lo tratta come un insieme raw di bit che vanno a formare un long.
tra quali valori è compreso il valore ritornato? dai risultati che da mi sembra 0 e 1...giusto?
ci ho dato un'occhiata veloce... ma se è una funzione di random dovrebbe restituire entro quell'intervallo.

In pratica Srand inizializza il seme, mentre Rand restituisce numeri random modularmente... diciamo ovviamente che questo sistema è pseudocasuale!

*spero che ti son stato d'aiuto*

ciao
Gio

Re: [C] generazione di numeri casuali

Inviato: gio 17 gen 2008, 12:59
da boh
A quanto mi sembra di vedere, la funzione random non viene "randomizzata" perchè a srand non viene fornito un seme.

Non ho capito cosa fa esattamente questo codice, ma se è fatto per generare numeri casuali ti consiglio una via di questo tipo:
Includi la libreria time:

Codice: Seleziona tutto

#include <time.h>
Randomizzi in questo modo la funzione random:

Codice: Seleziona tutto

srand( time( NULL ) );
E poi usi la funzione rand(), essendo sicuro che a ogni chiamata genererà numeri diversi dalla precedente.

Re: [C] generazione di numeri casuali

Inviato: gio 17 gen 2008, 13:10
da Blizzard
A quanto mi sembra di vedere, la funzione random non viene "randomizzata" perchè a srand non viene fornito un seme.
ciao,
la srand è randomizzata perchè il seme è fornito all'interno della funzione dalla dichiarazione+inizializzazione

Codice: Seleziona tutto

s1=(unsigned)time(&t);
s1 e s2 sono variabili globali che cambiano il loro valore in maniera pseudocasuale rimanendo in un certo intervallo deciso nelle define.


Comunque se vuoi vedere qualcosa di più sui generatori pseudocasuali ti consiglio
"Crittografia", di Ferragina e Luccio
è un bel libro, non costa molto e tratta bene anche questo problema.
Ad esempio fornisce una rapida spiegazione su un generatore basato sul sistema di crittografia DES. Personalmente lo trovo interessante e non richiede un rilevatore di raggi cosmici \:D/

Re: [C] generazione di numeri casuali

Inviato: gio 17 gen 2008, 13:12
da boh
Ah ok, grazie del chiarimento :)

Re: [C] generazione di numeri casuali

Inviato: gio 17 gen 2008, 14:00
da ccts2002
grazie mille!!!
sempre gentilissimi...penso proprio che farò come dice BOH...

ciaooooo

Re: [C] generazione di numeri casuali

Inviato: gio 17 gen 2008, 14:46
da Mario Vanoni
ccts2002 ha scritto:grazie mille!!!
sempre gentilissimi...penso proprio che farò come dice BOH...

ciaooooo
ATTENTO: non reinventare la ruota! "Work with the work of others!"

rand-1.9 di Erik Greenwald, in C, GPL

http://math.missouristate.edu/~erik/fil ... 1.9.tar.gz

Mario Vanoni

Re: [C] generazione di numeri casuali

Inviato: gio 17 gen 2008, 15:16
da puzuma
Mario Vanoni ha scritto: ATTENTO: non reinventare la ruota! "Work with the work of others!"
quoto anche perchè scrivere un "buon" generatore di numeri casuali non è affatto facile ...

Re: [C] generazione di numeri casuali

Inviato: gio 17 gen 2008, 19:21
da kobaiachi
se la applicazione che stai sviluppando puo connettersi ad internet e vuoi un generatore di numeri casuali VERO (non pseudo casuali) usa il generatore sviluppato dalla universita di Zagabria .
http://punto-informatico.it/p.aspx?i=2042502
http://random.irb.hr/

ciao

Re: [C] generazione di numeri casuali

Inviato: gio 17 gen 2008, 19:43
da ccts2002
kobaiachi ha scritto:se la applicazione che stai sviluppando puo connettersi ad internet e vuoi un generatore di numeri casuali VERO (non pseudo casuali) usa il generatore sviluppato dalla universita di Zagabria .
http://punto-informatico.it/p.aspx?i=2042502
http://random.irb.hr/

ciao
niente di cosi complicato...la funzione rand() di per se va più che bene...la mia era solo curiosità di capire quel codice, di cui, appunto, non capivo molto...
per quanto riguarda il non inventare la ruota, sono d'accordissimo, infatti cercavo in internet quello che proponeva...ma ripeto, rand() fa quello che deve fare...
grazie ancora