Opened 8 years ago
Last modified 8 years ago
#10921 new Bugs
Seeding boost::random::mt19937 from a pair of iterators throws an exception
Reported by: | Owned by: | No-Maintainer | |
---|---|---|---|
Milestone: | To Be Determined | Component: | random |
Version: | Boost 1.57.0 | Severity: | Problem |
Keywords: | Cc: |
Description
The problem is that when seeding boost::random::mt19937
from a pair of iterators std::invalid_argument("Not enough elements in call to seed")
exception is thrown.
An isolated test case looks like this:
#include <boost/array.hpp> #include <boost/random.hpp> //typedef boost::random::rand48 generator_t; typedef boost::random::mt19937 generator_t; int main() { typedef boost::array<int, 3> seed_range_t; seed_range_t seed = {1, 2, 3}; boost::random::seed_seq seed2(seed.begin(), seed.end()); generator_t generator1(seed2); // works fine seed_range_t::iterator begin = seed.begin(); generator_t generator2(begin, seed.end()); // throws std::invalid_argument("Not enough elements in call to seed") }
The documentation of the relevant constructor [1] does not help too much.
Please note that using the same input sequence through boost::random::seed_seq
works fine. Moreover, the same input sequence passed directly to the constructor of boost::random::rand48
generator also produces no exceptions.
I'm not sure if mersenne_twister_engine
needs larger input or the implementation is broken. Please advice.
This behavior is expected. The iterator constructors require you to provide a range sufficiently large to fill the entire state of the generator. Seeding with a pair of iterators is provided for backwards compatibility. New code should use seed_seq (or std::seed_seq).