Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
dlib
Commits
b436d840
Commit
b436d840
authored
Dec 18, 2011
by
Davis King
Browse files
Added a function for generating Gaussian random numbers.
parent
83623fd8
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
56 additions
and
0 deletions
+56
-0
dlib/rand/rand_kernel_1.h
dlib/rand/rand_kernel_1.h
+56
-0
No files found.
dlib/rand/rand_kernel_1.h
View file @
b436d840
...
@@ -44,6 +44,10 @@ namespace dlib
...
@@ -44,6 +44,10 @@ namespace dlib
max_val
*=
0x1000000
;
max_val
*=
0x1000000
;
max_val
+=
0xFFFFFF
;
max_val
+=
0xFFFFFF
;
max_val
+=
0.01
;
max_val
+=
0.01
;
has_gaussian
=
false
;
next_gaussian
=
0
;
}
}
virtual
~
rand
(
virtual
~
rand
(
...
@@ -56,6 +60,9 @@ namespace dlib
...
@@ -56,6 +60,9 @@ namespace dlib
mt
.
seed
();
mt
.
seed
();
seed
.
clear
();
seed
.
clear
();
has_gaussian
=
false
;
next_gaussian
=
0
;
// prime the generator a bit
// prime the generator a bit
for
(
int
i
=
0
;
i
<
10000
;
++
i
)
for
(
int
i
=
0
;
i
<
10000
;
++
i
)
mt
();
mt
();
...
@@ -92,6 +99,10 @@ namespace dlib
...
@@ -92,6 +99,10 @@ namespace dlib
// prime the generator a bit
// prime the generator a bit
for
(
int
i
=
0
;
i
<
10000
;
++
i
)
for
(
int
i
=
0
;
i
<
10000
;
++
i
)
mt
();
mt
();
has_gaussian
=
false
;
next_gaussian
=
0
;
}
}
unsigned
char
get_random_8bit_number
(
unsigned
char
get_random_8bit_number
(
...
@@ -164,6 +175,35 @@ namespace dlib
...
@@ -164,6 +175,35 @@ namespace dlib
}
}
}
}
double
get_random_gaussian
(
)
{
if
(
has_gaussian
)
{
has_gaussian
=
false
;
return
next_gaussian
;
}
double
x1
,
x2
,
w
;
const
double
rndmax
=
std
::
numeric_limits
<
dlib
::
uint32
>::
max
();
// Generate a pair of Gaussian random numbers using the Box-Muller transformation.
do
{
const
double
rnd1
=
get_random_32bit_number
()
/
rndmax
;
const
double
rnd2
=
get_random_32bit_number
()
/
rndmax
;
x1
=
2.0
*
rnd1
-
1.0
;
x2
=
2.0
*
rnd2
-
1.0
;
w
=
x1
*
x1
+
x2
*
x2
;
}
while
(
w
>=
1.0
);
w
=
std
::
sqrt
(
(
-
2.0
*
std
::
log
(
w
)
)
/
w
);
next_gaussian
=
x2
*
w
;
has_gaussian
=
true
;
return
x1
*
w
;
}
void
swap
(
void
swap
(
rand
&
item
rand
&
item
...
@@ -171,6 +211,8 @@ namespace dlib
...
@@ -171,6 +211,8 @@ namespace dlib
{
{
exchange
(
mt
,
item
.
mt
);
exchange
(
mt
,
item
.
mt
);
exchange
(
seed
,
item
.
seed
);
exchange
(
seed
,
item
.
seed
);
exchange
(
has_gaussian
,
item
.
has_gaussian
);
exchange
(
next_gaussian
,
item
.
next_gaussian
);
}
}
friend
void
serialize
(
friend
void
serialize
(
...
@@ -190,6 +232,8 @@ namespace dlib
...
@@ -190,6 +232,8 @@ namespace dlib
double
max_val
;
double
max_val
;
bool
has_gaussian
;
double
next_gaussian
;
};
};
...
@@ -210,8 +254,13 @@ namespace dlib
...
@@ -210,8 +254,13 @@ namespace dlib
std
::
ostream
&
out
std
::
ostream
&
out
)
)
{
{
int
version
=
1
;
serialize
(
version
,
out
);
serialize
(
item
.
mt
,
out
);
serialize
(
item
.
mt
,
out
);
serialize
(
item
.
seed
,
out
);
serialize
(
item
.
seed
,
out
);
serialize
(
item
.
has_gaussian
,
out
);
serialize
(
item
.
next_gaussian
,
out
);
}
}
inline
void
deserialize
(
inline
void
deserialize
(
...
@@ -219,8 +268,15 @@ namespace dlib
...
@@ -219,8 +268,15 @@ namespace dlib
std
::
istream
&
in
std
::
istream
&
in
)
)
{
{
int
version
;
deserialize
(
version
,
in
);
if
(
version
!=
1
)
throw
serialization_error
(
"Error deserializing object of type rand: unexpected version."
);
deserialize
(
item
.
mt
,
in
);
deserialize
(
item
.
mt
,
in
);
deserialize
(
item
.
seed
,
in
);
deserialize
(
item
.
seed
,
in
);
deserialize
(
item
.
has_gaussian
,
in
);
deserialize
(
item
.
next_gaussian
,
in
);
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment