Newsgroup: it.comp.lang.c++
Titolo: random

Eseguendo più volte un programma contenente
int r = ((rand()%2)+1);
ottengo sempre e cmq lo stesso numero (nella fattispecie 1).
Se invece inserisco la rand in un ciclo while:
int r;
while (1) {
r = ((rand()%2)+1);
printf("%d", r);
}
Ecco che meravigliosamente abbonda in varietà:
1 1 2 1 2 2 2 1 2 2 1 2 1 1 1 2 2 1 ...
Perchè?!?
--
Paolo

 Paolo
Ciao, Diego.

 1 1 2 1 2 2 2 1 2 2 1 2 1 1 1 2 2 1 ...
Il generatore fornisce numero PSUDO-casuali.
Praticamente, a partire da un numero iniziale detto "seme", i numeri 
successivi sono deternministicamente calcolati.
I numero usati all'interno del generatore sono molto piu' grandi del 
massimo numero casuale fornito. L'apetto esterno della sequenza 
fornita e' perfettamente casuale: non solo le probabilita` dei diversi 
risultati sono equamente distribuite, ma dalla conoscenza dei numeri 
precedentemente usciti non siamo in grado di prevedere quale sara' il 
prossimo.
Tuttavia, se il "seme" e' sempre lo stesso, la sequenza e' sempre lo stesso.
Di solito, in fase di test e' utile avere sequenze ripetitive; in fase di 
uso reale, se si desidera un comportamento sempre diverso, si fornisce come 
seme al generatore (tramite la funzione srand) un numero preso 
dall'orologio interno.
-- 
Mauro Mazzieri
A statesman is a politician who's been dead 10 or 15 years.
                -- Harry S. Truman


Forse perchè l'operatore % ritorna il resto della divisione per 2 di un
numero casuale. (quindi ritorna solo 0 o 1).
Se al resto sommi 1 otterrai soltanto i numeri 1 e 2...
Mi sembra che non ci siano errori nell'output del programma.
Se sbaglio correggimi.
ciao.

 Se sbaglio correggimi.
No, infatti, l'output del programma č assolutamente corretto.
Il problema stava nel senza while. La singola istruzione di random,
presa cosě, da sola, mi restituisce sempre (e dico sempre) il numero 1
nonostante mandi in esecuzione il mio programma migliaia di volte!
E sai com'č non sembra un numero random! :-)
--
Paolo

 E sai com'è non sembra un numero random! :-)
Non lo e'.  Come ti e' stato chiarito, si tratta di numero
PSEUDO-random: la _sequenza_ (non il singolo numero) possiede certe
proprieta' statistiche che la rendono indistinguibile da una
distribuzione uniforme di probabilita'; il _singolo_numero_ e'
generato da un algoritmo deterministico, e quindi perfettamente
prevedibile.  Leggi la documentazione di srand(3).
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

Ah! Avevo letto male io :)
Se vuoi puoi farti una funzione random da solo.
Io non ci ho mai provato ma ho letto un articolo a riguardo.
Diceva di trovare una funzione che generi un numero irrazionale (tipi pi
greco)
Non so se basti una semplice frazione per generarlo.
Dopodichè basta predere 2 cifre per volta del risultato per ottenere un
numero "casuale" da 00 a 99.
Ovviamente il programma darà output identici ogni volta che lo si esegue, ma
se la funzione può salvare i suoi dati in un file il problema è risolto.
ciao.

 Non so se basti una semplice frazione per generarlo.
ehm... se č irrazionale, č per definizione non-razionale,
cioč non riconducibile a una frazione :-))
--
Gerolamo

 Non so se basti una semplice frazione per generarlo.
sara`, ma la vedo un po' ardua generare un numero irrazionale da una 
frazione...
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

se può essere utile ecco una funzione in pseudo codice che genera un
numero casuale
  function IntNoise(32-bit integer: x)
    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) &
7fffffff) / 1073741824.0);   
  end IntNoise function
quei numeroni sono numeri primi... la funzione restituisce un numero
casuale tra -1.0 e 1.0 e bisogna passarle un intero (magari preso dal
timer interno) diverso ogni volta (anche in successione, naturalmente)
il nome della funzione è dovuto al fatto che l'ho presa da una pagina
in cui si parlava di perlin noise
-- 
]\/[ad]\/[age (
www.madmagelab.cjb.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

 Se vuoi puoi farti una funzione random da solo.
	Lo Stroustrup riporta una classe per la generazione di numeri casuali
usata nelle prime implementazioni del C++:
class Randint //uniform distribution, assuming 32 bit
{
	unsigned long randx;
public:
	Randint(long s = 0) { randx=s; }
	void seed( long s ) { randx=s; }
 
	//magic numbers chosen to use 31 bits of a 32 bit long
	long abs(long x) {return x&0x7fffffff;}
	static double max() { return 
2147483648
.0;}
	long draw() { return randx = randx*1103515245 + 12345; }
 
	double fdraw() {return abs(draw())/max();} //in [0,1]
	long operator() () { return abs(draw());} //in[0, 2^31]
};
Spero di aver copiato bene.
_dave_