Come si fa' a costruire una funzione random ? o
Come e' costruita la funzione random ?
Come si fa' a costruire una funzione random ? o
Come e' costruita la funzione random ?
per i numeri quasi-casuali c'è la funzione standard "rand", facente parte della standard library, che ritorna un intero compreso tra 0 e RAND_MAX.
RAND_MAX è difinito nell'header stdlib.h
la sequenza di numeri ritornata da rand è legata al seme random, che tu imposti con la funzione
srand(<intero>);
Ogni volta che imposti lo stesso seme random la sequenza di numeri generati sarà la stessa (se non imosti il seme, di default è 1).
di solito, per impostare un seme diverso in diverse esecuzioni dello stesso programma, si usa passare a srand l'ora di sistema.
A differenza di altri linguaggi di programmazione (tipo il pascal) la funzione random C non prende nessun argomento (niente valori massimi nè minimi, nè intervalli) quindi, per ottenere un numero casuale all'interno di un intervallo da te definito devi effettuare dei calcoli sul numero generato.
il modo di fare questo calcolo più usato è questo:
se vuoi generare un numero compreso tra 1 e 10
int a=1+(int)(10.0*rand()/(RAND_MAX+1.0));
altro modo di generare numeri random è la funzione "random", sempre inclusa nell'stdlib, che dovrebbe usare un'altro algoritmo.
A quanto mi è parso di capire questa seconda funzione è più complessa, ma in Linux usa lo stesso algoritmo di rand ( ), sembra che usi un algoritmo non-standard su piattaforme sun.
Drug misuse is not a disease, it is a decision, like the decision to step out in front of a moving car. [...] In this particular life-style the motto is "be happy now because tomorrow you are dying", but the dying begins almost at once, and the happiness is a memory.
Ma ad ogni riavvio crea sempre la stessa serie di numeri !
Non c'e' qualcosa di meglio ?
Purtroppo i computer sono delle macchine, non hanno il concetto di casualità: nulla nelle macchine è lasciato al caso... il caso viene generato attraverso la simulazione di un generatore casuale che fa uso di una funzione statistica per generare numeri pseudo-casuali.
Se ti interessa ho l'algoritmo di un generatore prodotto da un professore di statistica che, secondo lui (perchè io di statistica me ne intendo poco, non è il mio campo :gren: ), è migliore di quello usato nelle librerie atandard dei vari linguaggi.
Ciao.
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
hai usato il timer per impostare il seme random diverso a ogni avvio?
Drug misuse is not a disease, it is a decision, like the decision to step out in front of a moving car. [...] In this particular life-style the motto is "be happy now because tomorrow you are dying", but the dying begins almost at once, and the happiness is a memory.
inserisci prima della funzione questa linea di codice:Originariamente inviato da nightfall
Ma ad ogni riavvio crea sempre la stessa serie di numeri !
Non c'e' qualcosa di meglio ?
srand((unsigned)time(NULL));
e la sequenza non sarà sempre la stessa.
Motore di Ricerca del Forum :quipy:
...Terrible warlords, good warlords, and an english song
Fai così
Dovecodice:srand(time(NULL)); xxx = rand() % NN +1;
xxx = nome variabile
NN = sostituiscilo con i numeri compresi; ad es per far sì che scelga un numero a caso fra 1 e 1000, metti 1000 al posto di NN
+1 ti serve perchè altrimenti conterebbe da 0 e i valori verrebbero sfalsati: cioè se tu mettessi %6 non ti uscirebbero
1 2 3 4 5 6
ma bensì
0 1 2 3 4 5
Ah, come già detto i computer non possono calcolare un numero a caso dal nulla, però questo modo ci va vicino perchè funziona con l'orologio del sistema...è il metodo migliore che conosco, fammi sapere
Ok la fuzione rand() funziona ma
nello stesso secondo da valori uguali !
Te l'ho detto, è basato sull'orologio di sistema quindi se li apri proprio nello stesso secondo probabilmente te li dà uguali...ma hai bisogno di così tanta casualità? Non ti basta aspettare 1 secondo?Originariamente inviato da nightfall
Ok la fuzione rand() funziona ma
nello stesso secondo da valori uguali !
che io sappia questo è il metodo migliore... :quipy: