Hi,
I try to generate uniform random number between 0 and 1.
I wrote this code but it creates only numbers at the 0.1***.
Generated number always have 0.1 and remaning numbers change,
like 0.1234, 0.13444,0.143334....
Can you show me show how can I generate these numbers (uniformly) at (0,1].
double AOD;
srand((unsigned)time(NULL));
for (int i =0; i<10;++i)
{
AOD=((double) rand() / (RAND_MAX+1)) ;
cout<<endl<<AOD;
}
std::cout <<" Press ENTER to continue...";
std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
check up the doc on srand() ... normally using time(NULL) isn't so good as initial value, especially if you run the program quickly several times after another...
#include <iostream>
#include <ctime>
usingnamespace std;
//
// Generate a random number between 0 and 1
// return a uniform number in [0,1].
double unifRand()
{
return rand() / double(RAND_MAX);
}
//
// Generate a random number in a real interval.
// param a one end point of the interval
// param b the other end of the interval
// return a inform rand numberin [a,b].
double unifRand(double a, double b)
{
return (b-a)*unifRand() + a;
}
//
// Generate a random integer between 1 and a given value.
// param n the largest value
// return a uniform random value in [1,...,n]
long unifRand(long n)
{
if (n < 0) n = -n;
if (n==0) return 0;
/* There is a slight error in that this code can produce a return value of n+1
**
** return long(unifRand()*n) + 1;
*/
//Fixed code
long guard = (long) (unifRand() * n) +1;
return (guard > n)? n : guard;
}
//
// Reset the random number generator with the system clock.
void seed()
{
srand(time(0));
}
int main()
{
seed();
for (int i = 0; i < 20; ++i)
{
cout << unifRand() << endl;
}
return 0;
}
Yes and no...The chance of getting an n+1 result is small and I tested the mod on variouse ranges taking 108 samples and found the distrubution to be acceptable.