Newsgroup: it.comp.lang.c
Titolo: funzione random

Salve,
avrei bisogno di generare numeri in maniera random ogni volta che il mio
prg va in eseguzione.
Facendo cosi':
#include <stdlib.h>
main(void)
{
int j;
srand(j=(int) (1.0*rand()/(RAND_MAX+1.0)));
printf("%d\n%d\n",j,RAND_MAX);
}
ad ogni rand mi salta fuori sempre lo stesso numero.
In che modo devo impostare la funzione affinche ad ogni run mi ritoni
sempre un numero diverso?
grazie Antonio

>srand(j=(int) (1.0*rand()/(RAND_MAX+1.0)));
E' vero questa cosa genera un numero casuale che sfortunatamente e' sempre
lo stesso. Infatti il numero "casuale" viene calcolato matematicamente sul
seed che viene definito tramite srand.
Tra le altre cose il modo in cui e' scritta questa stringa dimostra che non
hai capito la differenza tra rand e srand.
Poniamo per esempio che rand in realta' altro non faccia che prendere il
seed (srand), e aggiungere 7 !!! (esempio stupido!!) Dopo di che aggiorna il
seed con il nuovo risultato.
Bene:
srand(5);
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
produrrebbe:
12
19
26
Capito ?!? srand() imposta il seed, ovvero il seme di partenza e rand() usa
il seed per calcolare matematicamente il numero che dovrebbe sembrare
casuale. Per questo motivo chiamando piu' volte rand() il numero cambia, ma
tutte le volte che avvio il programma la sequenza di numeri casuali sara' la
stessa!!! Ah, voglio precisare che rand() in realta' contiene dei calcoli
piu' complessi ed intelligenti !!!
Bene, ecco il trucco :
Il trucco consiste nel inizializzare il seed (con srand) con un numero che
sia diverso ogni volta che avvio il programma. Come fare ??? Bene, basta
includere <time.h> ed usare l'orologio interno del computer per dare il seed
di partenza !!!
srand((unsigned)time(NULL));
Ecco fatto !!!
A questo punto srando inizializza il seed per il generatore dei numeri
casuali con un numero che varia a seconda di quando viene eseguito il
programma ed in pratica ogni volta !!!
srand((unsigned)time(NULL));
printf("%d\n",rand()%500);
printf("%d\n",rand()%500);
printf("%d\n",rand()%500);
Questo programmino (molto migliorato rispetto al precedente) genera tre
numeri "casuali" che saranno diversi ad ogni esecuzione del programma.
Quello che volevi, no ?!?
Perche' rand()%500 e non rand() e basta ???
Bene rand() genera numeri non controllabili, mentre l'operatore (%) modulo
permette di deciderne il range: infatti rand()%500 genera un numero casuale
da 0 a 499 !!!
In questo modo sono certo che il numero sara' casuale ma che non sara' mai
inferiore a 0 ne superiore a 499.
rand()%1001 -> da 0 fino a 1000
(rand()%500)-250 -> da -250 fino a 249
Ok, capito come decidere il range ???
Questo credo sia tutto, se ti sono stato utile ti prego di farmelo sapere
.....
Alex
Antonio Imparato ha scritto nel messaggio ...


 sempre un numero diverso?
rand e' una funzione che genera numeri pseudo-casuali, nel senso che
la sequenza dei numeri generati dipende da un "seme", ossia dal valore
con cui viene inizializzata la funzione alla prima chiamata. Se vuoi
che ad ogni esecuzione ti venga restituita una sequenza diversa devi
dare tutte le volte un seme diverso; il modo classico per fare questo
e' chiamare la funzione srand() all'inizio del programma prima di
iniziare ad usare rand(). Aggiungi questa riga all'inizio del tuo
programma:
srand(time(NULL));
Non e' necessario richiamare la funzione srand() prima di ogni
chiamata di rand(), basta una volta, all'inizio del programma.
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it