PDA

Visualizza la versione completa : [C] Random e Liste


Tempestaxmen
29-11-2006, 14:39
Ciao, ho scritto un programma nel quale mi serviva creare dei numeri in modo random.
Io ho scritto:

int n;
n = rand()%80000+1;

volendo generare un numero compreso tra 1 ed 80000 (giusto?)

Il fatto che io devo generare almeno 100000 di questi numeri (anche ripetendoli) e quindi ho inserito quell'istruzione in un ciclo while(k!=100000) inizializzando k a zero.

Ogni volta che genero un nuovo numero lo inserisco in una lista di interi per tenere memoria solo dei numeri che sono tutti diversi. Qui ho il problema: nonostante genero 100000 numeri compresi tra 1 e 80000 alla fine mi ritrovo sempre con 32768 numeri diversi, non uno di pi.
A cosa dovuto??
Perch non ne genera altri??

Vi ringrazio per l'aiuto.
:dh:

andbin
29-11-2006, 15:04
Originariamente inviato da Tempestaxmen
Qui ho il problema: nonostante genero 100000 numeri compresi tra 1 e 80000 alla fine mi ritrovo sempre con 32768 numeri diversi, non uno di pi.
A cosa dovuto??
Perch non ne genera altri??Il range dei valori ottenibili da rand() dipende da come stata implementata la funzione rand() nella libreria di uno specifico compilatore.

Sul Visual C++, RAND_MAX vale 0x7fff (32767). Stessa cosa per il Dev-C++.
Su Linux invece la libreria fornisce una rand() che genera valori fino a 2147483647. Il valore RAND_MAX dichiarato in stdlib.h.

Tempestaxmen
29-11-2006, 15:10
Io sto utilizzando il Dev-C++...
ma allora non c' modo di generare un numero maggiore di elementi?

UltraBeginner
29-11-2006, 15:22
Originariamente inviato da Tempestaxmen
Io sto utilizzando il Dev-C++...
ma allora non c' modo di generare un numero maggiore di elementi?

guarda non dire se sia lecito farlo, pero' AndBind ti ha dato un suggerimento implicito:

se editi il file stdlib.h trovarai una riga con scritto


/*
* RAND_MAX is the maximum value that may be returned by rand.
* The minimum is zero.
*/
#define RAND_MAX 0x7FFF

/*
* These values may be used as exit status codes.
*/

se vuoi aumentare il valore del rand basta che cambi il valore di rand_max anke se, ripeto, non se sia lecito farlo. per es se vuoi numeri fino a 100000 devi impostare il valore 0x186A0 (che e' il suo equivalente in esadecimale, almeno secondo la calcolatrice....:D)

andbin
29-11-2006, 15:33
Originariamente inviato da UltraBeginner
se vuoi aumentare il valore del rand basta che cambi il valore di rand_max anke se, ripeto, non se sia lecito farlo. per es se vuoi numeri fino a 100000 devi impostare il valore 0x186A0 (che e' il suo equivalente in esadecimale, almeno secondo la calcolatrice....:D) Ma no assolutamente!!!! Cambiare quella define non porta ad avere un range diverso.
La funzione rand() stata studiata, implementata e quindi compilata nella libreria "standard" in un certo modo. Cambiare quella define non cambia il comportamento della rand().

Bisognerebbe esaminare il sorgente della funzione rand(), modificarlo e poi ricompilare la libreria "standard" del compilatore.

Ad esempio nel sorgente rand.c del VC++, non viene nemmeno usata la macro RAND_MAX. Viene fatto di brutto un AND con 0x7fff del valore ritornato.

Tempestaxmen
29-11-2006, 17:35
Ma allora si pu modificare rand() e poi ricompilare la libreria standard??
A me servirebbe arrivare ad ottenere almeno 100000 numeri
:( :confused:

UltraBeginner
29-11-2006, 17:55
Originariamente inviato da andbin
Ma no assolutamente!!!! Cambiare quella define non porta ad avere un range diverso.
La funzione rand() stata studiata, implementata e quindi compilata nella libreria "standard" in un certo modo. Cambiare quella define non cambia il comportamento della rand().

Bisognerebbe esaminare il sorgente della funzione rand(), modificarlo e poi ricompilare la libreria "standard" del compilatore.

Ad esempio nel sorgente rand.c del VC++, non viene nemmeno usata la macro RAND_MAX. Viene fatto di brutto un AND con 0x7fff del valore ritornato.

Cazziato e Mazziato :mame: :mame: Ergo, non si finisce mai di imparare :fagiano: :fagiano:

andbin
29-11-2006, 18:08
Originariamente inviato da Tempestaxmen
Ma allora si pu modificare rand() e poi ricompilare la libreria standard??Dipende se hai tutti i sorgenti della libreria, se hai i file di progetto (o i Makefile) gi pronti per poterla ricompilare, ecc...
Io personalmente eviterei di ricompilare la libreria standard, anche se fosse possibile ....


Originariamente inviato da Tempestaxmen
A me servirebbe arrivare ad ottenere almeno 100000 numeriTi conviene cercare in giro per la rete dei sorgenti validi per la generazione di numeri casuali. Purtroppo fare una buona funzione per la generazione di numeri casuali non proprio banale ....

Lak3d
29-11-2006, 18:14
io sar limitato ma non potevano generare (come in VB) un numero fra 0 e 1 che poi io moltiplicavo per il massimo del range che volevo ottenere?

MItaly
29-11-2006, 19:30
Ecco una possibile soluzione...


int nrand(int max)
{
if (max<=RAND_MAX)
return rand()%max;
else
return (int)((double)rand()/(double)max*RAND_MAX);
}

max , come si pu intuire, il numero massimo che si vuole ottenere.

Loading