PDA

View Full Version : [C] Perchè rand() a volte funziona e a volte no??


Helldron
10-12-2010, 11:41
Sto generando in C dei valori casuali usando la funzione rand().

In pratica sto usando delle variabili per descrivere un Impiegato e mi costruisco una stringa da stampare più volte su di un file, la cosa da notare (a parte quelle grosse fprintf) è l'uso delle variabili intere che io dentro l'if randomizzo. Ufficio e reparto sembrano tirare fuori sempre questo risultato:

2293260

Le altre mi danno valori coerenti (anno, a, m, g, stip).


#include <stdio.h>
#include <stdlib.h>
main () {

FILE *pf;
int i; //la matricola è l'intero "i" che si incrementa

.
.
.
.
.
int a, m, g; //data_nascita
int anno; //anno_assunzione
int stip; //stipendio

int uff; //numero dell'ufficio
int rep; //reparto effettivo

int f=0; //intero per scegliere a caso se avrò un ufficio o meno

pf = fopen ("dati.txt", "w");

if (pf) {
for (i=1; i<20; i++) {


anno=rand()%40 + 1970;
stip=rand()%750 + 850;
a=rand()%41 + 1950;
m=rand()%12 + 1;
g=rand()%31 + 1;

rep=rand()%10 + 1; //scelgo un reparto da 1 a 10 casuale


f=rand()%3 + 1; //scegli se avrò un ufficio
if (f==1) { // dipendente con ufficio
uff=rand()%10 + 1;
fprintf(pf,"%s%d%s%s%d%s%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%s%d%s\n", &s,i,&s2,&nome,i,&s2,&cognome,i,&s2,a,&separatore,m,&separatore,g,&s2,anno,&s2,stip,&s2,&uff,&s2,reparto,&rep,&s3);
}
else { // dipendente senza ufficio
fprintf(pf,"%s%d%s%s%d%s%s%d%s%d%s%d%s%d%s%d%s%d%s%s%s%s%d%s\n", &s,i,&s2,&nome,i,&s2,&cognome,i,&s2,a,&separatore,m,&separatore,g,&s2,anno,&s2,stip,&s2,&vuoto,&s2,reparto,&rep,&s3);
}
}

fclose (pf);
}

else printf("\nnon sei entrato.\n");

}

Mi sembra di usarle nello stesso identico modo, che succede???

Grazie :D

Supdario
10-12-2010, 15:38
Devi prima inizializzare il seed del generatore pseudorandom con questa funzione:

srand((unsigned)time(NULL));

Probabilmente dovrai includere time.h.

Come forse saprai la funzione rand() non è proprio casuale (dato che la casualità in matematica non esiste), quindi è necessario inizializzare il dato di partenza che servirà per generare la successione di numeri random.

banryu79
10-12-2010, 15:42
Circa la generazione di numeri random, consiglio vivamente (anche se al momento devi fare cose semplicissime) la lettura del tutorial scritto da Ziosilvio:
[Tutorial C/C++] Generazione di sequenze pseudorandom (http://www.hwupgrade.it/forum/showthread.php?t=1196677)

Helldron
13-12-2010, 07:35
Devi prima inizializzare il seed del generatore pseudorandom con questa funzione:

srand((unsigned)time(NULL));

Probabilmente dovrai includere time.h.

Come forse saprai la funzione rand() non è proprio casuale (dato che la casualità in matematica non esiste), quindi è necessario inizializzare il dato di partenza che servirà per generare la successione di numeri random.
Non va e aggiungo ancora una volta che la randomizzazione funziona perfettamente per tutte le variabili eccetto per rep ed uff, ora per uff mi da sempre 2293260 e rep sempre 2293256. E' stranissimo!!