首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::seed_seq::generate

template< class RandomIt > void generate( RandomIt begin, RandomIt end );

?

(since C++11)

填充范围[begin, end)带无符号整数值i,0≤i<232

的构造函数中提供的数据。seed_seq产生的值分布在整个32位范围内,即使初始值有很强的偏倚。

以下算法是根据Mersenne Twister生成器的初始化序列使用%28改编的松本真本和西村隆二(Takuji Nishimura)的改进2007,斋藤武所(MutsuoSaito)29%。

  • 如果begin == end什么都不做。否则,
  • 首先,将输出范围的每个元素设置为值。0x8b8b8b8b
  • 根据以下算法转换输出范围的元素:

k = 0,..., m-1

...

何地m=max(s+1, n)

n=end-begin

s=v.size()

v对象的构造函数最初提供的值的私有容器是否seed_seq反对,

  1. begin[k+p] += r1
  1. begin[k+q] += r2
  1. begin[k] = r2,,,

何地p=(n-t)/2

q=p+t

t=(n >= 623) ? 11 : (n >= 68) ? 7 : (n >= 39) ? 5 : (n >= 7) ? 3 : (n - 1) / 2

r1=1664525 * T(begin[k]^begin[k+p]^begin[k?1])

T(x) = x ^ (x >> 27)

r2=r1+s如果k==0,,,r2=r1 + k%n + v[k-1]如果0<k<=s,,,r2=r1 + k%n如果k>s...

k = m,..., m+n-1,,,

  1. begin[k+p] ^= r3
  1. begin[k+q] ^= r4
  1. begin[k]=r4

何地r3 = 1566083941 * T(begin[k]+begin[k+p]+begin[k-1])

r4=r3 - k%n...

所有的计算都是模232执行的。

输出范围%28的索引begin[x]%29为模n。

参数

begin, end

-

mutable random-access iterators whose std::iterator_traits<>::value_type is an unsigned integer type suitable for storing 32-bit values

类型要求

---它必须符合RandomAccessIterator的要求。

返回值

没有,结果将写入[begin, end)范围。

例外

只有当操作在beginend扔。

二次

代码语言:javascript
复制
#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';
}

二次

产出:

二次

代码语言:javascript
复制
4204997637
4246533866
1856049002
1129615051
690460811
1075771511
46783058
3904109078
1534123438
1495905678

二次

代码语言:txt
复制
 ? cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com