[C] generazione di numeri casuali

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

[C] generazione di numeri casuali

Messaggio 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!!!!

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C] generazione di numeri casuali

Messaggio 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

Avatar utente
boh
Linux 4.x
Linux 4.x
Messaggi: 1027
Iscritto il: ven 16 set 2005, 0:00
Slackware: 14.2 (x64)
Kernel: 4.4.111
Desktop: KDE 4.14.32
Località: Milano
Contatta:

Re: [C] generazione di numeri casuali

Messaggio 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.
"Be yourself. Everyone else is already taken." ~ Oscar Wilde

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C] generazione di numeri casuali

Messaggio 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/

Avatar utente
boh
Linux 4.x
Linux 4.x
Messaggi: 1027
Iscritto il: ven 16 set 2005, 0:00
Slackware: 14.2 (x64)
Kernel: 4.4.111
Desktop: KDE 4.14.32
Località: Milano
Contatta:

Re: [C] generazione di numeri casuali

Messaggio da boh »

Ah ok, grazie del chiarimento :)
"Be yourself. Everyone else is already taken." ~ Oscar Wilde

Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

Re: [C] generazione di numeri casuali

Messaggio da ccts2002 »

grazie mille!!!
sempre gentilissimi...penso proprio che farò come dice BOH...

ciaooooo

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [C] generazione di numeri casuali

Messaggio 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

Avatar utente
puzuma
Linux 2.x
Linux 2.x
Messaggi: 482
Iscritto il: mar 4 lug 2006, 17:14
Nome Cognome: Stefano Salvador
Slackware: current
Kernel: 2.6.32.2
Desktop: KDE 4.4.0
Località: Udine
Contatta:

Re: [C] generazione di numeri casuali

Messaggio 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 ...
The quiet ones are the ones who change the world. The loud ones only take the credit.

kobaiachi
Linux 4.x
Linux 4.x
Messaggi: 1368
Iscritto il: gio 14 lug 2005, 0:00
Località: roma
Contatta:

Re: [C] generazione di numeri casuali

Messaggio 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

Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

Re: [C] generazione di numeri casuali

Messaggio 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

Rispondi