Random.cpp
Go to the documentation of this file.
1
/*
2
* random.c
3
*
4
* implementiert lagged Fibonacci random sequence
5
* exakt nach Knuth TAOCP Vol.2 pp.186f
6
*
7
*/
8
#include <stdio.h>
9
#include "
Random.h
"
10
11
using namespace
MiscLib
;
12
13
#define KK 100
14
#define LL 37
15
#define MM MiscLib_RN_RAND_MOD
16
#define TT 70
17
18
#define mod_diff(x,y) ( (x) - (y) & (MM-1) )
19
#define is_odd(x) ( (x) & 1 )
20
#define evenize(x) ( (x) & (MM-2) )
21
22
size_t
MiscLib::rn_buf
[
MiscLib_RN_BUFSIZE
];
23
size_t
MiscLib::rn_point
=
MiscLib_RN_BUFSIZE
;
24
25
void
MiscLib::rn_setseed
(
size_t
seed)
26
{
27
register
int
t, j;
28
size_t
x[
KK
+
KK
- 1];
29
register
size_t
ss =
evenize
(seed + 2);
30
for
(j = 0; j <
KK
; j++)
31
{
32
x[j] = ss;
33
ss <<= 1;
34
if
(ss >=
MM
)
35
{
36
ss -=
MM
- 2;
37
}
38
}
39
for
(; j <
KK
+
KK
- 1; j++)
40
{
41
x[j] = 0;
42
}
43
x[1]++;
44
ss = seed & (
MM
- 1);
45
t =
TT
- 1;
46
while
(t)
47
{
48
for
(j =
KK
- 1; j > 0; j--)
49
{
50
x[j + j] = x[j];
51
}
52
for
(j =
KK
+
KK
- 2; j >
KK
-
LL
; j -= 2)
53
{
54
x[
KK
+
KK
- 1 - j] =
evenize
(x[j]);
55
}
56
for
(j =
KK
+
KK
- 2; j >=
KK
; j--)
if
(
is_odd
(x[j]))
57
{
58
x[j - (
KK
-
LL
)] =
mod_diff
(x[j - (
KK
-
LL
)], x[j]);
59
x[j -
KK
] =
mod_diff
(x[j -
KK
], x[j]);
60
}
61
if
(
is_odd
(ss))
62
{
63
for
(j =
KK
; j > 0; j--)
64
{
65
x[j] = x[j - 1];
66
}
67
x[0] = x[
KK
];
68
if
(
is_odd
(x[
KK
]))
69
{
70
x[
LL
] =
mod_diff
(x[
LL
], x[
KK
]);
71
}
72
}
73
if
(ss)
74
{
75
ss >>= 1;
76
}
77
else
78
{
79
t--;
80
}
81
}
82
for
(j = 0; j <
LL
; j++)
83
{
84
rn_buf
[j +
KK
-
LL
] = x[j];
85
}
86
for
(; j <
KK
; j++)
87
{
88
rn_buf
[j -
LL
] = x[j];
89
}
90
}
91
92
size_t
MiscLib::rn_refresh
()
93
{
94
/* You remember Duff's device? If it would help then it should be used here */
95
rn_point
= 1;
96
97
register
int
i, j;
98
for
(j =
KK
; j <
MiscLib_RN_BUFSIZE
; j++)
99
{
100
rn_buf
[j] =
mod_diff
(
rn_buf
[j -
KK
],
rn_buf
[j -
LL
]);
101
}
102
for
(i = 0; i <
LL
; i++, j++)
103
{
104
rn_buf
[i] =
mod_diff
(
rn_buf
[j -
KK
],
rn_buf
[j -
LL
]);
105
}
106
for
(; i <
KK
; i++, j++)
107
{
108
rn_buf
[i] =
mod_diff
(
rn_buf
[j -
KK
],
rn_buf
[i -
LL
]);
109
}
110
111
112
return
*
rn_buf
;
113
}
LL
#define LL
Definition:
Random.cpp:14
MiscLib_RN_BUFSIZE
#define MiscLib_RN_BUFSIZE
Definition:
Random.h:10
MiscLib::rn_point
size_t rn_point
Definition:
Random.cpp:23
KK
#define KK
Definition:
Random.cpp:13
TT
#define TT
Definition:
Random.cpp:16
MiscLib::rn_setseed
void rn_setseed(size_t)
Definition:
Random.cpp:25
is_odd
#define is_odd(x)
Definition:
Random.cpp:19
MiscLib
Definition:
AlignedAllocator.h:11
MiscLib::rn_buf
size_t rn_buf[]
Definition:
Random.cpp:22
MiscLib::rn_refresh
size_t rn_refresh(void)
Definition:
Random.cpp:92
Random.h
evenize
#define evenize(x)
Definition:
Random.cpp:20
mod_diff
#define mod_diff(x, y)
Definition:
Random.cpp:18
MM
#define MM
Definition:
Random.cpp:15
VisionX
components
pointcloud_processor
EfficientRANSACPrimitiveExtractor
EfficientRANSAC
MiscLib
Random.cpp
Generated on Sat Oct 12 2024 09:14:17 for armarx_documentation by
1.8.17