PDA

Visualizza la versione completa : [ANSI C] Generatore di numeri casuali


Storm Sentry
05-09-2003, 21:46
Ciao

l'altro giorno ho avuto dei grossi problemi a creare un generatore di numeri casuali in C, tanto ke ho deciso di rinunciarci e di farlo in java (e l'ho già fatto)

il mio problema è semplice semplice: come si fa a generare un numero casuale in C?

a tal proposito guardando all'interno della documentazione delle librerie standard e ho trovato la seguente funzione:

#include <stdlib.h>
int rand (void);

"La funzione rand() genera una sequenza di numeri pseudo-casuali. Ad ogni chiamata, rand() restituisce un intero compreso tra 0 e RAND_MAX"
(cito testualmente dal libro)

.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-

#include <stdlib.h>
void srand(unsigned seed);

"La funzione srand() definisce un punto iniziale per la sequenza generata da rand(), la funzione che restituisce numeri pseudo-casuali" (anche qua cito testualmente)


guardando nell'header, RAND_MAX vale 2 miliardi e qualcosa (2^31) e fin qui tutto bene.

quando però uso questa funzione mi genera sempre la stessa sequenza di numeri. in java invece la Math.random() restituisce sempre un numero diverso. Ho provato ad aggirare il problema creandomi un generatore di numeri casuali e funzionerebbe bene ma va inizalizzato con un numero casuale e il problema torna come da principio.

Sono sicuro ke mi sto perdendo un bicchier d'acqua, ma son so propiro come andarci fuori. Voi come fareste?

Grazie mille

ciao!

br0tz
06-09-2003, 00:25
prova con

#include <time.h>

void randomize(void);

int random(int max);

genera un numero (casuale se ricordo bene) tra 0 e max-1

ciao

inuy4sha
06-09-2003, 00:38
ti consiglio di cercare tra le librerie del c, una libreria che gestica l'ora e di generare un numero casuale in funzione dell'ora ... es :
se ti serve un numero tra 1 e 60 ti basta prendere il tempo in secondi in quell'istante ( variabilie aleatoria con probabilita uniforme 1/60) se ti serve un numero + grande ti basta una funzione che amplifichi la cosa lasciando uniforme la pribabilità ...
60 / 6 e ottieni un numero casuale tra 1 e 10
se prendi i millisecondi hai 1/1000
se prendi (ore /2.4)(minuti/60)(secondi/6)millisecondi la tua v.a assume valori €[0;1000000] :) non so cosa tu debba rappresentare ma 1000000 di possibilità nn sono poche!
( non programmo in c e pochissimo in c++ quindi non so che libreria sia) ciao

br0tz
06-09-2003, 12:50
Originariamente inviato da inuy4sha
ti consiglio di cercare tra le librerie del c, una libreria che gestica l'ora e di generare un numero casuale in funzione dell'ora ...
è proprio quello che fa il randomize(); inizialzza il generatore di numero casuali ad un valore casuale

cmq prima ho scordato un #include <stdlib.h>
per usare il random();

Storm Sentry
06-09-2003, 16:26
grazie mille a tutti. dopo provo e stasera vi so dire.

ciau!!! :ciauz:

Storm Sentry
07-09-2003, 00:37
ho appena provato con la libreria time.h e come mi hai detto ma non funziona.

innanzitutto mi dice ke la funzione randomize() non esiste nell'header e cmq, quando la tolgo, random(int) restituisce sempre lo stesso numero casuale quando chiamo il programma (lavoravo in ambiente Redhat 9)

una soluzione ci sarebbe...ed è quella di implementare un thread che continua a generare la sequenza....e poi viene bloccato da una pressione di un tasto del'utente...purtroppo xò in windows questo nn si può fare... :(

vabbè pazienza..grazie lo stesso. :ciauz:

URANIO
07-09-2003, 02:57
La funzione rand FUNZIONA!
Ti da sempre lo stesso risultato perchè non cambi il seme!
Ora non ricordo se è seed o srand comq prima della funzione fai una cosa del genere
srand(time)

in questo modo inserisci un seme nuovo e "casuale"

goglol
07-09-2003, 12:00
Io ho dovuto sviluppare un gioco che simula l'estrazione del gioco del lotto! ho usato questo codice che mi è stato indicato su questo forum e credo che non mi ha dato problemi:

srand( (unsigned)time( NULL ) );
numero=(rand()%90+1) ;
ciao

br0tz
07-09-2003, 16:35
scusa....

ma....

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

void main ()
{
int n;

randomize();

n=random(100);
printf("%d",n);

}


non funziona?????

Johnny_Depp
07-09-2003, 16:53
esiste il motore di ricerca del forum ( U S A T E L O )

chiave: rand

risultati:
http://forum.html.it/forum/search.php?s=&action=showresults&searchid=1006832&sortby=&sortorder=

questo fa giusto al caso tuo:
http://forum.html.it/forum/showthread.php?s=&threadid=491591&highlight=rand

Loading