PDA

View Full Version : Random con C++


Misagi
25-01-2005, 15:49
Salve, vorrei sapere se in questo modo ottengo numeri casuali da -1000 a 1000??
O se c'è un altro modo simile per farlo??

numero_casuale=(rand()%(2000+1))-1000;

Grazie ;)

fek
25-01-2005, 16:12
Questa ormai e' una FAQ :)
Chi si prende la briga di scriverla?



float FloatRand()
{
return rand() / (RAND_MAX + 1);
}


int IntRand(unsigned int range, int bias)
{
return (int) (range * frand()) + bias;
}
...

unsigned int x = IntRand(2000, -1000);


Questa e' la versione piu' C++ (ma puzza di overengineering):


class IntRand
{
public:
IntRand(
unsigned int range,
int bias)
: m_Range(range)
, m_Bias(bias)
{
}

unsigned int Generate(void)
{
float randomFloatValue = rand() / (RAND_MAX + 1);
return (int) (m_Range * randomFloatValue) + m_Bias;
}

private:
unsigned int m_Range;
int m_Bias;
};

...
IntRand intRand(2000, -1000); // da -1000 a +1000
intRand.Generate();


Edit: Refactoring! :D

Ziosilvio
25-01-2005, 16:12
Cerca nei vecchi post.
Scoprirai non solo come si fa, ma anche il motivo per cui il metodo che tu suggerisci non è particolarmente consigliato.

Ubi-Wan
25-01-2005, 17:32
Ziosilvio scommetto che non si ottiene una distribuzione uniforme se RAND_MAX non e' un multiplo di x per rand()%x! :D

Ziosilvio
25-01-2005, 18:05
Originariamente inviato da Ubi-Wan
Ziosilvio scommetto che non si ottiene una distribuzione uniforme se RAND_MAX non e' un multiplo di x per rand()%x! :D
Cerca nei vecchi post :D e non confondere RAND_MAX, che è il massimo valore ottenibile, con RAND_MAX+1 che è il numero di valori distinti ottenibili ;)

Ziosilvio
25-01-2005, 18:07
Uh uh... non me ne ero accorto subito...
Originariamente inviato da fek
float FloatRand()
{
return rand() / (RAND_MAX + 1);
}
Questa funzione restituisce sempre 0.0 --- ESERCIZIO: dire perché.

fek
25-01-2005, 19:48
Originariamente inviato da Ziosilvio
Uh uh... non me ne ero accorto subito...

Questa funzione restituisce sempre 0.0 --- ESERCIZIO: dire perché.

Perche' sono stupido e non l'ho castato a float...

Versione corretta:


float FloatRand()
{
return (float) rand() / (RAND_MAX + 1);
}

Ubi-Wan
25-01-2005, 20:31
Originariamente inviato da Ziosilvio
Cerca nei vecchi post :D e non confondere RAND_MAX, che è il massimo valore ottenibile, con RAND_MAX+1 che è il numero di valori distinti ottenibili ;)

sapevo che c'era di sicuro qualcosa che non andava in quello che avevo scritto :)

Misagi
26-01-2005, 12:23
Grazie delle informazioni, volevo sapere se la parola bias ha qualche significato specifico o è solo una parola utilizzata a caso!

Misagi
27-01-2005, 10:12
Up :confused:

fek
27-01-2005, 11:55
Originariamente inviato da Misagi
Grazie delle informazioni, volevo sapere se la parola bias ha qualche significato specifico o è solo una parola utilizzata a caso!

http://www.moreorless.net/diz/MoL_B.html

bias = deviazione

Banus
27-01-2005, 15:17
Originariamente inviato da Ziosilvio
Cerca nei vecchi post :D e non confondere RAND_MAX, che è il massimo valore ottenibile, con RAND_MAX+1 che è il numero di valori distinti ottenibili ;)
Sembra una pignoleria ma non lo è affatto :D
Un po' di tempo fa ho scritto un algoritmo che generava automaticamente labirinti di grosse dimensioni, ma spesso mi capitava di avere una o due caselle "cannate". Dopo un lungo e intenso debug mi sono accorto che succedeva quando disgraziatamente ottenevo il risultato 1 dal random :p (1 volta su 30000 :D)