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.
Code:
#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;
}
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.