Добавил:
yermolenkoigor9
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <stdio.h>
#include <stdlib.h>
/* Минимальный компактный генератор случайных чисел Парка и Миллера */
/* константы Льюиса-Гудмана-Миллера */
#define IA 16807
#define IM 2147483647
#define AM (1./IM)
/* константы Шаржа */
#define IQ 127773
#define IR 2836
/* Специальная маска (см. ниже) */
#define MASK 123456789
long r=0.6;
static long dummy=&r;
/* начальное значение для всех генераторов */
//void Seed(long dum) {dummy=dum;}
/* возвращает случайное число на промежутке от 0 до 1 */
float unirand0(void) {
long k;
float ans;
dummy^=MASK;/* избегаем dummy==0 */
k=dummy/IQ;
if((dummy=IA*(dummy-k*IQ)-IR*k)<0) dummy+=IM;
ans=AM*dummy;
dummy^=MASK;/* восстанавливаем dummy */
return(ans);
}
/* Минимальный компактный генератор случайных чисел Бейса-Дурхема */
/* Предыдущие фукнции и константы были описаны выше. */
#define NTAB 32
#define NWUP 8
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
float unirand1(void) {
int j;
long k;
static long iy=0,iv[NTAB];
float temp;
/* инициализация */
if(dummy<=0 || !iy) {
/* следим, чтобы значение было положительным */
if(dummy<0) dummy=-dummy;
else if(dummy==0) dummy=1;
for(j=NTAB+NWUP-1;j>=0;j--) {
k=dummy/IQ;
if((dummy=IA*(dummy-k*IQ)-IR*k)<0) dummy+=IM;
if(j<NTAB) iv[j]=dummy;
}
/* первый элемент из таблицы */
iy=iv[0];
}
/* генерируем новое число */
k=dummy/IQ;
if((dummy=IA*(dummy-k*IQ)-IR*k)<0) dummy+=IM;
iy=iv[j=iy/NDIV];iv[j]=dummy;
if((temp=AM*iy)>RNMX) return(RNMX);
else return(temp);
}
int main()
{
float x[1000];
int i;
for(i=0;i<1000;i++)
{
x[i]=unirand1();
printf("%f\n",x[i]);
}
// printf("%d\n",repeatsearcher(x));
return 0;
}