Генератор случайных чисел по алгоритму Парка-Миллера.
По заверениям дает белый шум.
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <stdio . h>
/* Minimal portable random generator by Park and Miller */
/* Lewis-Goodman-Miller constants */
#define IA 16807
#define IM 2147483647
#define AM ( 1 ./IM)
/* Scharge constants */
#define IQ 12773
#define IR 2836
#define NTAB 32
#define NWUP 8
#define NDIV ( 1 +(IM- 1 )/NTAB)
#define EPS 1. 2e- 7
#define RNMX ( 1.0 -EPS)
/* Special mask to be explained below */
#define MASK 123456789
static long dummy;
/* initial seed, for all the generators here */
void Seed(long dum)
/* returns random uniformly distributed between 0 and 1 */
float unirand0(void)
float unirand1(void)
/* first specimen from the table */
iy=iv[ 0 ];
}
/* regular work: generate new number */
k = dummy / IQ;
if ((dummy = IA * (dummy - k * IQ) - IR * k) < 0 )
dummy += IM;
/* shuffle output */
iy = iv[j = iy / NDIV];
iv[j] = dummy;
/* return */
if ((temp = AM * iy) > RNMX)
return(RNMX);
else
return(temp);
}
void main()
|
>>bcc32 parkmiller.c
З.Ы. Код не совсем нормализован, некоторые места можно сократить.