1
#include <iostream>
2
#include <time.h>
3
4
using namespace std;
5
6
// generate random numbers
7
class randomNumber
8

{
9
public:
10
// initialize the random number generator
11
randomNumber(long s = 0);
12
13
// return a 32-bit random integer m, 1 <= m <= 2^31-2
14
long random();
15
16
// return a 32-bit random integer m, 0 <= m <= n-1,
17
// where n <= 2^31-1
18
long random(long n);
19
20
// return a real number x, 0 <= x < 1
21
double frandom();
22
23
private:
24
static const long A;
25
static const long M;
26
static const long Q;
27
static const long R;
28
29
long seed;
30
};
31
32
const long randomNumber::A = 48271;
33
const long randomNumber::M = 2147483647;
34
const long randomNumber::Q = M / A;
35
const long randomNumber::R = M % A;
36
37
randomNumber::randomNumber(long s)
38

{
39
if (s < 0)
40
s = 0;
41
42
if (s == 0)
43
{
44
// get time of day in seconds since 12:00 AM,
45
// January 1, 1970
46
long t_time = time(NULL);
47
48
// mix-up bits by squaring
49
t_time *= t_time;
50
// result can overflow. handle cases
51
// > 0, < 0, = 0
52
if (t_time > 0)
53
s = t_time ^ 0x5EECE66DL;
54
else if (t_time < 0)
55
s = (t_time & 0x7fffffff) ^ 0x5EECE66DL;
56
else
57
s = 0x5EECE66DL;
58
}
59
60
seed = s;
61
}
62
63
long randomNumber::random()
64

{
65
long tmpSeed = A * ( seed % Q ) - R * ( seed / Q );
66
67
if( tmpSeed >= 0 )
68
seed = tmpSeed;
69
else
70
seed = tmpSeed + M;
71
72
return seed;
73
}
74
75
long randomNumber::random(long n)
76

{
77
double fraction = double(random())/double(M);
78
79
return int(fraction * n);
80
}
81
82
double randomNumber::frandom()
83

{
84
return double(random())/double(M);
85
}
86

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
