/*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2016 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#error This file may only be included from folly/Random.h
#endif
+#include <array>
+
namespace folly {
namespace detail {
StateSize<std::mersenne_twister_engine<UIntType, w, n, m, r,
a, u, d, s, b, t, c, l, f>>::value;
-#if FOLLY_USE_SIMD_PRNG
+#if FOLLY_HAVE_EXTRANDOM_SFMT19937
template <class UIntType, size_t m, size_t pos1, size_t sl1, size_t sl2,
size_t sr1, size_t sr2, uint32_t msk1, uint32_t msk2, uint32_t msk3,
StateSize<std::subtract_with_carry_engine<UIntType, w, s, r>>::value;
template <class RNG>
-std::seed_seq generateSeed() {
- std::array<uint32_t, StateSize<RNG>::value> seed_data;
- Random::secureRandom(seed_data.begin(), seed_data.size() * sizeof(uint32_t));
- return std::seed_seq(std::begin(seed_data), std::end(seed_data));
-}
+struct SeedData {
+ SeedData() {
+ Random::secureRandom(seedData.data(), seedData.size() * sizeof(uint32_t));
+ }
+
+ static constexpr size_t stateSize = StateSize<RNG>::value;
+ std::array<uint32_t, stateSize> seedData;
+};
} // namespace detail
template <class RNG>
void Random::seed(ValidRNG<RNG>& rng) {
- auto s = detail::generateSeed<RNG>();
+ detail::SeedData<RNG> sd;
+ std::seed_seq s(std::begin(sd.seedData), std::end(sd.seedData));
rng.seed(s);
}
template <class RNG>
auto Random::create() -> ValidRNG<RNG> {
- auto s = detail::generateSeed<RNG>();
+ detail::SeedData<RNG> sd;
+ std::seed_seq s(std::begin(sd.seedData), std::end(sd.seedData));
return RNG(s);
}