Hi all,
I found a code in the forum, but i don't know if the number produced are uniform and independent.
#include <iostream>
#include <ctime>
using namespace 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 < 500; ++i)
{
cout << unifRand() << endl;
}
return 0;
}
Your code has the same guarantees as rand(). Uniform? Yes. Independent? Well there's a million ways to test independence. The standard C random number generator is not great, but it really depends on what you are doing. For most academic purposes it will suffice. For Monte Carlo simulations etc not even close.