Pagina 1 di 1

funzione numero casuale

Inviato: 15 nov 2009, 20:31
da exodd
esiste una libreria in C che abbia una funzione che ti ritorna un numero casuale da 0 a n?

Inviato: 15 nov 2009, 21:27
da Gatto

Inviato: 16 nov 2009, 01:24
da SkZ
Google? :lol:

la risposta e' no. Ma c'e' una funzione che ritorna un intero tra 0 e $ ~2^n-1 $ con n i bit della macchina (se ben ricordo). Cmq il valore massimo e' memorizzato in una variabile/macro.
di conseguenza te la puoi costruire con rand() e RAND_MAX

Inviato: 16 nov 2009, 04:46
da Tibor Gallai
Io uso questo per ritornare un intero tra 0 e n-1:

Codice: Seleziona tutto

#define rnd_i(n) ((int)((double)(n)*(rand())/(RAND_MAX+1.0)))
Però non ho mai dovuto scrivere roba dove l'uniformità dei valori casuali fosse critica, e so che la maggior parte delle implementazioni di rand() fanno veramente cagare...

Inviato: 16 nov 2009, 09:22
da flexwifi
Il problema e' che la funzione rand si basa su un generatore che se non viene cambiato almeno una volta, ti crea sempre la stessa sequenza pseudo-random (perche' di default viene posto a 1).
Un trucco per avere una sequenza piu' casuale e' settare all'inizio in maniera piu' o meno casuale il generatore della sequenza pseudo-random (per esempio basandosi sul clock di sistema che in teoria viene incrementato ogni volta dall'inizio dei tempi).
Quindi ti conviene usare prima la funzione srand per creare un generatore piu' o meno casuale e poi la funzione rand ogni volta che ti serve un numero casuale. Il codice puo' essere qualcosa del tipo:

/*Creo un generatore piu' o meno casuale di sequenze random*/
srand((unsigned int)time(NULL));

E poi per avere un numero tra 0 e n chiamo la funzione:

(rand() % (n+1))

con la condizione che (n+1) sia minore uguale a RAND_MAX

oppure usare la funzione che ha scritto Tibor.

Bye

Inviato: 16 nov 2009, 21:06
da Tibor Gallai
flexwifi ha scritto:(rand() % (n+1))
Deh, così non viene uniforme nemmeno nel caso ideale in cui rand() è uniforme.
Non che col mio metodo sia uniforme, ma è distribuita il meglio possibile, se è chiaro cosa intendo...