math-library

Форк
0
/
Random.cpp 
52 строки · 941.0 Байт
1

2
//	my_rand():			алгоритм взят из книги "Numerical Recipes in C", с.279
3
//	my_rand_norm():		алгоритм взят из книги Кнут "Искусство программирования", раздел 3.4, с.4
4

5
#include <math.h>
6
#include <time.h>
7
#include <assert.h>
8

9
#include "Random.h"
10

11
#define IA 16807
12
#define IM 2147483647
13
#define AM (1.0/IM)
14
#define IQ 127773
15
#define IR 2836
16
#define MASK 123459876
17

18
long SEED;
19

20
void my_randomize()
21
{ 
22
	SEED = time(NULL);
23
}
24

25
double my_rand(double min, double max)
26
{
27
	assert(min<max);
28

29
	long k;
30
	double ans;
31

32
	SEED ^= MASK;
33
	k = SEED/MASK;
34
	SEED = IA*(SEED - k*IQ) - IR*k;
35
	if(SEED < 0) SEED += IM;
36
	ans = AM*SEED;
37
	SEED ^= MASK;
38

39
	return min + ans*(max - min);
40
}
41

42
double my_rand_norm(double Mu0, double D)
43
{
44
	double v1,v2,s;
45
	
46
	do{
47
		v1 = 2*my_rand(0,1) - 1;
48
		v2 = 2*my_rand(0,1) - 1;
49
		s = pow(v1,2) + pow(v2,2);
50
	} while(s>=1);
51

52
	return Mu0 + D*v1*sqrt(-2*log(s)/s);
53
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.