Newsgroup: it.comp.lang.c++
Titolo: Generatore di numeri casuali

Avrei bisogno di generare dei numeri casuali da 1 a 6 (per simulare un
dado). Ho provato a usare la funzione rand come spiegato nell'help di
MSDN senza risultati apprezzabili (ottengo sempre lo stesso numero).
Apprezzerei moltissimo se qualcuno potesse inviarmi il codice.
Grazie.
Andrea Nagar


wrote:

Questo č l'esempio, in C, di rand su MSDN....
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main( void )
{
   int i;
   /* Seed the random-number generator with current time so that
    * the numbers will be different every time we run.
    */
   srand( (unsigned)time( NULL ) );
   /* Display 10 numbers. */
   for( i = 0;   i < 10;i++ )
      printf( "  %6d\n", rand() );
}
Come fa a darti sempre lo stesso numero? Va bene che rand() fa un po
schifo, ma almeno dei numeri un po diversi li genera!!!
Luc.

Sei OT.
detto questo, prima di usare rand occorre inizializzare
il generatoredi numeri casuali con randomize:
Header File
stdlib.h
Category
Math Routines
Syntax
#include <stdlib.h>
#include <time.h>
void randomize(void);
Description
Initializes random number generator.
randomize initializes the random number generator with a random value.
Return Value
None.

il generatoredi numeri casuali con randomize:
randomize? Questo si che è OT... la funzione standard è srand()
Luc.

 randomize? Questo si che è OT... la funzione standard è srand()
sia rand, che randomize, che srand, sono
incluse in <stdlib.h>.
Quindi non capisco xche' randomize è OT e srand non lo è.
Ho usato randomize per dargli una spiegazione allo
strano comportamento di rand, per il quale esisteva un motivo
ben preciso.
Tu non gli hai spiegato xche' rand "sembrasse" non funzionare:
hai supposto che: "si be' una funzione di libreria
semplicemente non funziona, allora usane un'altra."
non è un modo per risolvere il problema.

Credo che bastasse dirgli che le funzioni rand danno sempre la stessa
sequenza di numeri casuali se si usa sempre lo stesso seme.
Ni hao.

 sequenza di numeri casuali se si usa sempre lo stesso seme.
Questo è vero:
ma il problema era che
-stando a quanto scritto nel post originale-
si otteneva sempre lo stesso numero:
passi per la stessa sequenza di numeri (che puo'
andar bene o meno)
ma una funzione randomica ritrna
sempre lo stesso numero...
penso che non accontenti neanche il peggiore degli
statistici.

 incluse in <stdlib.h>.
Forse nel tuo compilatore. Ma randomize() non è standard. Sulla
documentazione del BCC55 è riportata come compatibile con la sola
piattaforma Win32.
EMG

 hai supposto che: "si be' una funzione di libreria
Mi correggo: lo hai spiegato,
solo che è implicitamente incluso nel codice dell'esempio.
Chiedo scusa.

>Ma randomize() non è standard.
Anche nel mio compilatore (BCB4.0),
randomize e' supportata solo su piattaforma win32.
Mi sono fatto trarre in inganno dall'help
di rand che ti indirizza sia su randomize
che su srand, e dal fatto che sia inclusa in <stdlib.h>.

 ha scritto nel messaggio news:WZ=eOghsB7s3kB3...@4ax.com...


 ha scritto:

E' stato detto molte volte che rand è una funzione veramente pessima a causa
delle infime caratteristiche statistiche da cui è caratterizzata (anche
nelle faq del ng è consigliato di usare altro). Se proprio c'è ancora chi
vuole ostinarsi ad usarla, raccomanderei almeno di non peggiorare la
situazione usando rand()%n per generare un numero da 0 a n-1; si utilizzi
invece il seguente codice:
// Ritorna un numero casuale da 0 ÷ n-1
int CASUrand(const int n)
{
 const int S=(RAND_MAX+1)/n,X=S*n;
 int x; if(X) { do x=rand(); while(x>=X); } else x=rand();
 return x/S; // Appena più veloce di x%n
}
quindi per generare un numero *pseudocasule* da 1 a 6 scriverai
n=CASUrand(6)+1.
Nell'eventualità (che sembra ormai remota) che ci si rendesse conto di non
dover utilizzare rand(), basterà sostituire l'orripilante rand() con la
chiamata alla funzione del nuovo generatore e sostituire l'orribile RAND_MAX
con il corrispondente valore del nuovo generatore. Ovviamente "const int S"
dovrà essere sostituito dal tipo adatto a contenere il valore del nuovo
generatore.
Forse vale la pena ripetere (ogni qualche mese) che il web è pieno di ottimi
generatori di numeri pseudocasuali e pochi minuti di ricerca valgono bene un
generatore che sostituisca l'abominevole funzione standard.
Cristiano