template< class RandomIt > void generate( RandomIt begin, RandomIt end ); | (since C++11) |
Fills the range [begin, end)
with unsigned integer values i
, 0 ≤ i < 232
, based on the data originally provided in the constructor of this seed_seq
. The produced values are distributed over the entire 32-bit range even if the initial values were strongly biased.
The following algorithm is used (adapted from the initialization sequence of the Mersenne Twister generator by Makoto Matsumoto and Takuji Nishimura, incorporating the improvements made by Mutsuo Saito in 2007).
begin == end
, do nothing. Otherwise, 0x8b8b8b8b
For k = 0,..., m-1
.
where m=max(s+1, n)
and n=end-begin
and s=v.size()
and v
is the private container holding the values originally provided by the constructor of this seed_seq
object,
begin[k+p] += r1
begin[k+q] += r2
begin[k] = r2
, where p=(n-t)/2
and q=p+t
and t=(n >= 623) ? 11 : (n >= 68) ? 7 : (n >= 39) ? 5 : (n >= 7) ? 3 : (n - 1) / 2
and r1=1664525 * T(begin[k]^begin[k+p]^begin[k−1])
and T(x) = x ^ (x >> 27)
and r2=r1+s
if k==0
, r2=r1 + k%n + v[k-1]
if 0<k<=s
, r2=r1 + k%n
if k>s
.
For k = m,..., m+n-1
,
begin[k+p] ^= r3
begin[k+q] ^= r4
begin[k]=r4
where r3 = 1566083941 * T(begin[k]+begin[k+p]+begin[k-1])
and r4=r3 - k%n
.
where all calculations are performed modulo 232
and where the indexing of the output range (begin[x]
) is taken modulo n.
begin, end | - | mutable random-access iterators whose std::iterator_traits<>::value_type is an unsigned integer type suitable for storing 32-bit values |
Type requirements | ||
-RandomIt must meet the requirements of LegacyRandomAccessIterator. |
none, the results are written to the [begin, end)
range.
Only throws if the operations on begin
and end
throw.
#include <random> #include <iostream> int main() { std::seed_seq seq({1,2,3,4,5}); std::vector<std::uint32_t> seeds(10); seq.generate(seeds.begin(), seeds.end()); // Step 1: fill with 0x8b8b8b8b // seeds = {2341178251, 2341178251, 2341178251, 2341178251, 2341178251, // 2341178251, 2341178251, 2341178251, 2341178251, 2341178251 } // // Step 2: // n = 10, s = 5, t = 3, p = 3, q = 6, m = 10 // // First iteration, k = 0; r1 = 1371501266, r2 = 1371501271 // // seeds = {1371501271, 2341178251, 2341178251, 3712679517, 2341178251, // 2341178251, 3712679522, 2341178251, 2341178251, 2341178251 } // // Iterations from k = 1 to k = 5 (r2 = r1 + k%n + v[k-1]) // // r1 = 2786190137, 3204727651, 4173325571, 1979226628, 401983366 // r2 = 2786190139, 3204727655, 4173325577, 1979226636, 401983376 // // seeds = {3350727907, 3188173515, 3204727655, 4173325577, 1979226636, // 401983376, 3591037797, 2811627722, 1652921976, 2219536532 } // // Iterations from k = 6 to k = 9 (r2 = r1 + k%n) // // r1 = 2718637909, 1378394210, 2297813071, 1608643617 // r2 = 2718637915, 1378394217, 2297813079, 1608643626 // // seeds = { 434154821, 1191019290, 3237041891, 1256752498, 4277039715, // 2010627002, 2718637915, 1378394217, 2297813079, 1608643626 } // // Step 3 // iterations from k = 10 to k = 19, using ^= to modify the output // // r1 = 1615303485, 3210438310, 893477041, 2884072672, 1918321961, // r2 = 1615303485, 3210438309, 893477039, 2884072669, 1918321957 // // seeds = { 303093272, 3210438309, 893477039, 2884072669, 1918321957, // 1117182731, 1772877958, 2669970405, 3182737656, 4094066935 } // // r1 = 423054846, 46783064, 3904109085, 1534123446, 1495905687 // r2 = 423054841, 46783058, 3904109078, 1534123438, 1495905678 // // seeds = { 4204997637, 4246533866, 1856049002, 1129615051, 690460811, // 1075771511, 46783058, 3904109078, 1534123438, 1495905678 } for(std::uint32_t n : seeds) std::cout << n << '\n'; }
Output:
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/numeric/random/seed_seq/generate