C++随机数

随机数

C++标准库定义了一组随机数引擎类和适配器,使用不同数学方法生成伪随机数。标准库还定义了一组分布模板,根据不同的概率分布生成随机数。引擎和分布类型的名字都与它们的数学性质相对应。定义在头文件random中。

随机数引擎操作
Engine e;默认构造函数;使用该引擎默认的种子
Engine e(s);使用整形s作为种子
e.seed(s)使用种子s重置引擎的状态
e.min() e.max()此引擎可生成的最小和最大值
Engine::result_type此引擎生成的unsigned整形类型
e.discard(u)将引擎推进u步;u的类型为unsigned long long

大多数场合,随机数引擎的输出是不能直接使用的,这也是为什么早先我们称之为原始随机数。问题出在生成的随机数的值范围通常与我们需要的不符,而正确转换随机数的范围是极其困难的。
为了得到一个指定范围内的数,我们需要一个分布类型的对象。

分布类型的操作
Dist d;默认构造函数;使d准备好被使用。其他构造函数依赖于Dist的类型;分布类型的构造函数是explicit的
d(e)用相同的e连续调用d的话,会根据d的分布式类型生成一个随机数序列;e是一个随机数引擎对象
d.min() d.max()返回d(e)能生成的最小值和最大值
d.reset()重建d的状态,使得随后对d的使用不依赖于d已经生成的值

一个给定的随机数发生器一直会生成相同的随机数序列。一个函数如果定义了局部的随机数发生器,应该将其(包括引擎和分布对象)定义为static的。否则,每次调用函数都会生成相同的序列。

随机数分布
均匀分布
  • uniform_int_distribution< IntT > u(m, n);
  • uniform_real_distribution< RealT > u(x, y);
    生成指定类型的,在给定包含范围内的值。m(或x)是可以返回的最小值;n(或y)是最大值。m默认为0;n默认为类型IntT对象可以表示的最大值。x默认为0.0,y默认为1.0。
伯努利分布
  • bernoulli_distribution b( p );
    以给定概率p生成true;p的默认值为0.5。
  • binomial_distribution< IntT> b(t, p);
    分布是按采样大小为整形值t,概率为p生成的;t的默认值为1,p的默认值为0.5。
  • geometric_distribution< IntT > g§;
    每次实验成功的概率为p;p的默认值为0.5。
  • negative_binomial_distribution< IntT > nb(k, p);
    k(整形值)次实验成功的概率为p;k的默认值为1,p的默认值为0.5。
泊松分布
  • poisson_distribution< IntT > p(x);
    均值为double值x的分布。
  • exponential_distribution< RealT > e(lam);
    指数分布,参数lambda通过浮点值lam给出;lam的默认值为1.0。
  • gamma_distribution< RealT > g(a, b);
    alpha(形状参数)为a,beta(尺度参数)为b;两者的默认值均为1.0。、
  • weibull_distribution< RealT > w(a, b);
    形状参数为a,尺度参数为b的分布;两者的默认值均为1.0。
  • extreme_value_distribution< RealT > e(a, b);
    a的默认值为0.0,b的默认值为1.0。
正太分布
  • normal_distribution< RealT > n(m, s);
    均值为m,标准差为s;m的默认值为0.0,s的默认值为1.0。
  • lognormal_distribution< RealT > ln(m, s);
    均值为m,标准差为s;m的默认值为0.0,s的默认值为1.0。
  • chi_squared_distribution< RealT > c(x);
    自由度为x;默认值为1.0。
  • cauchy_distribution< RealT > c(a, b);
    位置参数a和尺度参数b的默认值分别为0.0和1.0。
  • fisher_f_distribution< RealT > f(m, n);
    自由度为m和n;默认值均为1。
  • student_t_distribution< RealT > s(n);
    自由度为n;n的默认值均为1。
抽样分布
  • discrete_distribution< IntT > d(i, j);
  • discrete_distribution< IntT > d{il};
    i和j是一个权重序列的输入迭代器,il是一个权重的花括号列表。权重必须能转换为double。
  • piecewise_constant_distribution< RealT > pc(b, e, w);
    b,e和w是输入迭代器。
  • piecewise_linear_distribution< RealT > pl(b, e, w);
    b,e和w是输入迭代器。
随机数引擎

标准库定义了三个类,实现了不同的算法来生成随机数。标准库还定义了三个适配器,可以修改给定引擎生成的序列。引擎和引擎适配器都是模板。于分布的参数不同,这些引擎的参数更为复杂,且需深入了解特定引擎使用的数学知识。

  • default_random_engine
    某个其他引擎类型的类别别名,目的是用于大多数情况。
  • linear_congruenrtial_engine
    minstd_rand0 的乘数为16807, 模为2147483647,增量为0。
    minstd_rand 的乘数为48271,模为2147483647,增量为0。
  • mersenne_twister_engine
    mt19937 为32位无符号梅森旋转生成器
    mt19937_64 为64位无符号梅森旋转生成器
  • subtract_with_carry_engine
    ranlux24_base 为32位无符号借位减法生成器。
    ranlux48_base 为64位无符号借位减法生成器。
  • discard_block_engine
    引擎适配器,将其底层引擎的结果丢弃。用要使用的底层引擎,块大小和旧块大小来参数化。
    ranlux24使用ranlux24_base引擎,块大小位223,旧块大小的23。
    ranlux48使用ranlux48_base引擎,块大小位389,旧块大小的11。
  • independent_bits_engine
    引擎适配器,生成指定位数的随机数。用要使用的底层引擎,结果的位数以及保存生成的二进制位的无符号整形类型来参数化。指定的位数必须小于指定的无符号类型所能保存的位数。
  • shuffle_order_engine
    引擎适配器,返回的就是底层引擎生成的数,但返回的顺序不同。用要使用的底层引擎和要混洗的元素数目来参数化。
    knuth_b使用minstd_rand0和表大小256。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值