Repository 32bit  Forum
Repository 64bit  Wiki

[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.

[C] generazione di numeri casuali

Messaggioda ccts2002 » mer gen 16, 2008 23:41

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
ccts2002
Linux 2.0
Linux 2.0
 
Messaggi: 155
Iscritto il: gio nov 09, 2006 23:20
Località: milano - trieste - catania

Re: [C] generazione di numeri casuali

Messaggioda Blizzard » gio gen 17, 2008 10:25

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
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C] generazione di numeri casuali

Messaggioda boh » gio gen 17, 2008 12:59

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
boh
Linux 2.6
Linux 2.6
 
Messaggi: 953
Iscritto il: gio set 15, 2005 23:00
Località: Milano
Slackware: 14.1 (x64)
Kernel: 3.14.1
Desktop: KDE 4.13.3

Re: [C] generazione di numeri casuali

Messaggioda Blizzard » gio gen 17, 2008 13:10

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
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C] generazione di numeri casuali

Messaggioda boh » gio gen 17, 2008 13:12

Ah ok, grazie del chiarimento :)
"Be yourself. Everyone else is already taken." ~ Oscar Wilde
Avatar utente
boh
Linux 2.6
Linux 2.6
 
Messaggi: 953
Iscritto il: gio set 15, 2005 23:00
Località: Milano
Slackware: 14.1 (x64)
Kernel: 3.14.1
Desktop: KDE 4.13.3

Re: [C] generazione di numeri casuali

Messaggioda ccts2002 » gio gen 17, 2008 14:00

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

ciaooooo
Avatar utente
ccts2002
Linux 2.0
Linux 2.0
 
Messaggi: 155
Iscritto il: gio nov 09, 2006 23:20
Località: milano - trieste - catania

Re: [C] generazione di numeri casuali

Messaggioda Mario Vanoni » gio gen 17, 2008 14:46

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [C] generazione di numeri casuali

Messaggioda puzuma » gio gen 17, 2008 15:16

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.
Avatar utente
puzuma
Linux 2.4
Linux 2.4
 
Messaggi: 481
Iscritto il: mar lug 04, 2006 16:14
Località: Udine
Nome Cognome: Stefano Salvador
Slackware: current
Kernel: 2.6.32.2
Desktop: KDE 4.4.0

Re: [C] generazione di numeri casuali

Messaggioda kobaiachi » gio gen 17, 2008 19:21

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
kobaiachi
Linux 3.x
Linux 3.x
 
Messaggi: 1368
Iscritto il: mer lug 13, 2005 23:00
Località: roma

Re: [C] generazione di numeri casuali

Messaggioda ccts2002 » gio gen 17, 2008 19:43

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
Avatar utente
ccts2002
Linux 2.0
Linux 2.0
 
Messaggi: 155
Iscritto il: gio nov 09, 2006 23:20
Località: milano - trieste - catania


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite