Skip to content

Commit b08aa05

Browse files
authored
Use 64-bit RNG for types that are 64 bits (#865)
Do this instead of casting down every time we do a normal distribution.
1 parent adc6dca commit b08aa05

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

include/boost/math/tools/random_vector.hpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
// Boost Software License, Version 1.0. (See accompanying file
55
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
66

7-
#include <vector>
7+
#include <cstddef>
88
#include <random>
99
#include <type_traits>
10-
#include <cstddef>
10+
#include <vector>
1111

1212
namespace boost { namespace math {
1313

@@ -25,12 +25,12 @@ std::vector<T> generate_random_vector(std::size_t size, std::size_t seed)
2525
}
2626
std::vector<T> v(size);
2727

28-
std::mt19937 gen(seed);
28+
std::mt19937_64 gen(seed);
2929

3030
std::normal_distribution<T> dis(0, 1);
31-
for(std::size_t i = 0; i < v.size(); ++i)
31+
for (auto& x : v)
3232
{
33-
v[i] = dis(gen);
33+
x = dis(gen);
3434
}
3535
return v;
3636
}
@@ -49,9 +49,9 @@ std::vector<T> generate_random_uniform_vector(std::size_t size, std::size_t seed
4949

5050
std::uniform_real_distribution<T> dis(lower_bound, upper_bound);
5151

52-
for (auto& i : v)
52+
for (auto& x : v)
5353
{
54-
i = dis(gen);
54+
x = dis(gen);
5555
}
5656

5757
return v;
@@ -70,9 +70,9 @@ std::vector<T> generate_random_vector(std::size_t size, std::size_t seed, T mean
7070
std::mt19937 gen(seed);
7171

7272
std::normal_distribution<T> dis(mean, stddev);
73-
for (std::size_t i = 0; i < v.size(); ++i)
73+
for (auto& x : v)
7474
{
75-
v[i] = dis(gen);
75+
x = dis(gen);
7676
}
7777
return v;
7878
}
@@ -87,13 +87,13 @@ std::vector<T> generate_random_vector(std::size_t size, std::size_t seed)
8787
}
8888
std::vector<T> v(size);
8989

90-
std::mt19937 gen(seed);
90+
std::mt19937_64 gen(seed);
9191

9292
// Rescaling by larger than 2 is UB!
9393
std::uniform_int_distribution<T> dis(std::numeric_limits<T>::lowest()/2, (std::numeric_limits<T>::max)()/2);
94-
for (std::size_t i = 0; i < v.size(); ++i)
94+
for (auto& x : v)
9595
{
96-
v[i] = dis(gen);
96+
x = dis(gen);
9797
}
9898
return v;
9999
}

0 commit comments

Comments
 (0)