#define IA 16807
#define IM 2147483647
#define AM (1.0 / IM)
#define IQ 127773
#define IR 2836
#define NTAB 32
#define NDIV (1 + (IM - 1) / NTAB)
#define EPS 1.2e-7
#define RNMX (1.0 - EPS)
/*
Minimal random number generator of Park and Miller with Bays - Durham shuffle and added safeguards. Returns a uniform random deviate between 0.0 and 1.0 (exclusive of the endpoint values). Call with idum a negative integer to initialize; thereafter, do not alter idum between successive deviates in a sequence. RNMX should approximate
the largest floating value that is less than 1.
*/
float ran1(long *idum)
{
int j;
long k;
static long iy = 0;
static long iv[NTAB];
float temp;
if (*idum <= 0 || !iy)
{
/*
* Initialize.
*/
if (-(*idum) < 1) *idum = 1;
/* Be sure to prevent idum = 0. */
else *idum = -(*idum);
for (j = NTAB + 7; j >= 0; j--)
{
/*
* Load the shuffle table (after 8 warm - ups).
*/
k = (*idum) / IQ;
*Idum = IA * (*idum - k * IQ) - IR * k;
if (*idum < 0) *idum += IM;
if (j < NTAB) iv[j] = *idum;
}
iy = iv[0];
}
/*
* Start here when not initializing.
*/
k = (*idum) / IQ;
/*
Compute idum = (IA * idum) % IM without overflows by Schrage's method.
*/
* idum = IA * (*idum - k * IQ) - IR * k;
if (*idum < 0) *idum += IM;
/*
* Will be in the range 0..NTAB -1.
*/
j = iy / NDIV;
/*
* Output previously stored value and refill the shuffle table
*/
iy = iv[j];
iv[j] = *idum;
/*
* Because users don't expect endpoint values
*/
if ((temp = AM * iy) > RNMX) return RNMX;
else return temp;
}
Can anyone help me with generation of random numbers in the iPhone SDK?
The rule with the random() function is and has always been to only use it for generating seeds to other, better random generators.
Here's a random number generator I included in my own code recently. It's the portable 'ran1' generator recommended by Numerical Recipes in C. It generates uniformly distributed random numbers from the set (0,1) with a period of ~10^9.
~SNIP~
If you want to generate uniform random deviates for simulations etc., this is a good algorithm.
For encryption, you're best off using the OpenSSL library versus trying to hand code your own ciphers.