Newsgroup: it.comp.lang.c++
Titolo: alcune domande stupide

Ho cominciato a programmare da pochi anni e a scuola usiamo il pascal. Perň
recentemente ho iniziato a fare qualcosa anche in c++ e avrei alcune domande
da porre:
- esistono le variabili booleane in c++, se si come si usano e come si
dichiarano?
- esiste una funzione per generare dei numeri casuali? In pascal facevo
cosě:
randomize;
x:=random(t);
come si fa l'operazione corrispondente in c++ e come faccio a dare un
intervallo ai numeri casuali?

 - esiste una funzione per generare dei numeri casuali?
Guardati rand() e srand() della libreria standard C.
EMG

 Guardati rand() e srand() della libreria standard C.
Guardale bene, e poi evitale, a meno che le tue esigenze in fatto
di "qualita`" delle sequenze di numeri pseudo-casuali prodotte
non siano praticamente inesistenti.  Mediamente, sono petecchie.
Meglio usare un BUON generatore, e suggerisco il Mersenne
Twister di Matsumoto e Nisimura: periodo 2^19937 - 1, con
equidistribuzione ottimale sino a 623 dimensioni.
Alla pagina 
http://www.math.keio.ac.jp/~matumoto/emt.html
trovi tutte le info e i link alle varie implementazioni disponibili.
Alex

intervallo ai numeri casuali?
Certo che esiste. Per assegnare ad una variabile un numero casuale
basta utilizzare quest' istruzione:
variabile = (rand() % limite);
Prima di far questo perň devi inizializzare il generatore di numeri
casuali:
srand(time());
Sulla bontŕ di questo generatore nutro comunque forti sospetti.
Ultimamente ho fatto delle prove e mi é sembrato che la sequenza di
numeri casuali generata sia sempre la stessa.
Il Ghenio
-----
Proteggeremo il mondo della devastazione!
Uniremo tutti i popoli nella nostra nazione!
Denunceremo i mali della veritŕ e dell'amore,
Estenderemo il nostro potere fino alle stelle.
Jesse!
James!
Team Rocket pronto a partire alla velocitŕ della luce.
Arrendetevi subito oppure preparatevi a combattere.
Miaaaoooo, proprio cosi'!
(Team Rocket)
-----

non siano praticamente inesistenti.  Mediamente, sono petecchie.
In effetti anche a me é venuto spesso il sospetto che i numeri
generati si ripetano con troppa frequenza.
Il Ghenio
-----
Proteggeremo il mondo della devastazione!
Uniremo tutti i popoli nella nostra nazione!
Denunceremo i mali della verità e dell'amore,
Estenderemo il nostro potere fino alle stelle.
Jesse!
James!
Team Rocket pronto a partire alla velocità della luce.


 variabile = (rand() % limite);
Se usi questa tecnica ci credo che la sequenza ti sembri poco valida ad
occhio.
EMG

occhio.
Perché? Tu che tecnica utilizzi?


 Perché? Tu che tecnica utilizzi?
Dalle FAQ:
13.16:  How can I get random integers in a certain range?
A:      The obvious way,
                rand() % N              /* POOR */
        (which tries to return numbers from 0 to N-1) is poor, because
        the low-order bits of many random number generators are
        distressingly *non*-random.  (See question 13.18.)  A better
        method is something like
                (int)((double)rand() / ((double)RAND_MAX + 1) * N)
        If you're worried about using floating point, you could use
                rand() / (RAND_MAX / N + 1)
        Both methods obviously require knowing RAND_MAX (which ANSI
        #defines in <stdlib.h>), and assume that N is much less than
        RAND_MAX.
        (Note, by the way, that RAND_MAX is a *constant* telling you
        what the fixed range of the C library rand() function is.  You
        cannot set RAND_MAX to some other value, and there is no way of
        requesting that rand() return numbers in some other range.)
        If you're starting with a random number generator which returns
        floating-point values between 0 and 1, all you have to do to get
        integers from 0 to N-1 is multiply the output of that generator
        by N.
        References: K&R2 Sec. 7.8.7 p. 168; PCS Sec. 11 p. 172.
EMG

         distressingly *non*-random.  (See question 13.18.)  A better
Questo problema e` tipico dei generatori lineari congruenziali (anche
quelli buoni).  L'analisi spettrale, illustrata da Knuth in "The Art of
Computer Programming", mostra molto bene i perche` e i percome
di questo problema (occorre una buona base matematica per seguire
questa parte, come per la gran parte di "The Art", ovviamente).
Un BUON generatore di numeri pseudo-casuali dovrebbe garantire
una "equa casualita`" dei vari bit generali, ma uno lineare congruenziale
NON PUO` garantirla, per ragioni legati all'analisi spettrale.  Quindi, e`
meglio usare un altro tipo di generatore.  Knuth ne propone uno (ancora
piuttosto valido), ma il "Mersenne Twister", piu` moderno, e` secondo
me preferibile.  Ne ripeto l'URL:
 
http://www.math.keio.ac.jp/~matumoto/emt.html
Qui si trovano i link a trattazioni teoriche, implementazioni
esemplificative,
implementazioni ottimizzate, ecc ecc.
Alex