funzione numero casuale

Programmazione, algoritmica, teoria dell'informazione, ...
Rispondi
Avatar utente
exodd
Messaggi: 728
Iscritto il: 09 mar 2007, 19:46
Località: sulle pendici della provincia più alta d'europa

funzione numero casuale

Messaggio da exodd »

esiste una libreria in C che abbia una funzione che ti ritorna un numero casuale da 0 a n?
Tutto è possibile: L'impossibile richiede solo più tempo
julio14 ha scritto: jordan è in realtà l'origine e il fine di tutti i mali in $ \mathbb{N} $
EvaristeG ha scritto:Quindi la logica non ci capisce un'allegra e convergente mazza.
ispiratore del BTA

in geometry, angles are angels

"la traslazione non è altro che un'omotetia di centro infinito e k... molto strano"
Avatar utente
Gatto
Messaggi: 487
Iscritto il: 25 nov 2007, 16:36
Località: Roma

Messaggio da Gatto »

"Fu chiaro sin dall'inizio che ogni qual volta c'era un lavoro da fare, il gatto si rendeva irreperibile." (George Orwell - La fattoria degli animali)
Avatar utente
SkZ
Messaggi: 3333
Iscritto il: 03 ago 2006, 21:02
Località: Concepcion, Chile
Contatta:

Messaggio 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
impara il [tex]~\LaTeX[/tex] e mettilo da par[tex]\TeX~[/tex]

Software is like sex: it's better when it's free (Linus T.)
membro: Club Nostalgici
Non essere egoista, dona anche tu! http://fpv.hacknight.org/a8.php
Tibor Gallai
Messaggi: 1776
Iscritto il: 17 nov 2007, 19:12

Messaggio 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...
[quote="Pigkappa"]Penso che faresti un favore al mondo se aprissi un bel topic di bestemmie da qualche parte in modo che ti bannino subito.[/quote]
flexwifi
Messaggi: 90
Iscritto il: 11 giu 2007, 22:04

Messaggio 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
Tibor Gallai
Messaggi: 1776
Iscritto il: 17 nov 2007, 19:12

Messaggio 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...
[quote="Pigkappa"]Penso che faresti un favore al mondo se aprissi un bel topic di bestemmie da qualche parte in modo che ti bannino subito.[/quote]
Rispondi