double randd(FILE * urandom){ double d; int *i = (void *)&d + sizeof (double) - sizeof (int); fread(&d, 1, sizeof (d), urandom); *i &= 0x800fffff; *i |= 0x3fe00000; return d;}
Класичний long int random(void); трішечки не годиться: точність в нього велика лише на 64 розрядній системі.
grep INT_MAX /usr/include/limits.h# define INT_MIN (-INT_MAX - 1)# define INT_MAX 2147483647# define UINT_MAX 4294967295U
double oqut_random(FILE * urandom){ double d; int *i = (void *)&d + sizeof (double) - sizeof (int); fread(&d, 1, sizeof (d), urandom); *i &= 0x800fffff; *i |= 0x3ff00000; return (d > 0.) ? d - 1. : d + 1.;}
Одним із найшвидших генераторів псевдовипадкових чисел, які мають рівномірний розподіл і досить великий період повторення послідовності(~2^90, якщо не помиляюся) є алгоритм xorshift.
unsigned long xorshiftrand(void) { static unsigned long x=123456789, y=362436069, z=521288629, w=88675123; unsigned long t; t = x ^ (x << 11); x = y; y = z; z = w; return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); }