首页 > 编程知识 正文

vs随机生成随机数,在线生成随机数

时间:2023-05-03 19:40:28 阅读:119876 作者:4042

c标准库提供了生成随机和伪随机数的类。 这些类包括:

随机数生成器类:生成均匀分布的整数序列的伪随机数生成器,如随机数引擎、随机数引擎适配器和预定义随机数生成器。 随机数分布类:将生成器生成的数字序列转换为遵循特定随机变量分布(如均匀分布、正态分布和泊松分布)的数字序列对象。 随机数引擎随机数引擎可以使用种子数据作为熵源来生成伪随机数。

随机种子:初始化随机数发生器,用算法产生重复随机数。 最简单的使用方法是将其作为第一个随机数产生下一个随机数。

模板角色linear_congruential_engine实现线性联合算法mersenne_twister_engine,内向的subtract _ with _ carrer算法减少进位(对于没有高级算术指令集的处理器,酷黑生成器速度非常快,但状态存储可能很大,具有不期望的频谱特性。 向内的天空吸引器速度慢,具有较大的状态存储要求,但只要有正确的参数,就会有最长的不可重复序列,具有最期望的频谱特性

这里介绍了线性同余发动机和内向天空拖拉机的详细实现过程。

线性联合算法线性联合算法的实现比较简单,数学表达如下。

x1=mod(axnb ),c ) x_{n1}=(text ) mod ) left ) a*x_nb ) cccright ),c ) right ) xn1=mod ) c

但是,其参数a、b、c需要满足一定的条件,在此通过以下方式实现网上的c代码之一。

静态单元32 prng state=0; uint32init_rand(uint32seed )/seedthepseudo-randomnumbergeneratorprngstate=seed; //successfulprocessingreturnsuccess; }uint32_rand(void ) { uint32 value; //usealinearcongruentialgenerator (lcg ) toupdatethestateoftheprngprngstate *=1103515245; prngState =12345; value=(prngstate16 )0x07FF; prngState *=1103515245; prngState =12345; value=10 value|=(prngstate16 )0x03FF; prngState *=1103515245; prngState =12345; value=10 value|=(prngstate16 )0x03FF; //returntherandomvaluereturnvalue; }int32rand_range(int32min,int32 max ) { int32 value; //valid参数? if (最大值)//pickuparandomvalueinthegivenrangevalue=min (_ rand (

) % (max - min + 1)); } else { //Use default value value = min; }​ //Return the random value return value;}

该代码摘自知乎博文

内向的天空缠绕器

内向的天空缠绕器的实现过程较为复杂

第一阶段:初始化,根据随机种子获得初始的内向的天空旋转链;第二阶段:根据已有内向的天空旋转链进行旋转算法获取下一次循环的旋转链;第三阶段:根据内向的天空旋转链计算随机数;

其C++代码实现如下:

#include <iostream>#include <string.h>#include <stdio.h>#include <time.h>using namespace std;bool isInit;int index;int MT[624]; //624 * 32 - 31 = 19937void srand(int seed){ index = 0; isInit = 1; MT[0] = seed; for(int i=1; i<624; i++) { int t = 1812433253 * (MT[i-1] ^ (MT[i-1] >> 30)) + i; MT[i] = t & 0xffffffff; //取最后的32位 }}void generate(){ for(int i=0; i<624; i++) { // 2^31 = 0x80000000 // 2^31-1 = 0x7fffffff int y = (MT[i] & 0x80000000) + (MT[(i+1) % 624] & 0x7fffffff); MT[i] = MT[(i + 397) % 624] ^ (y >> 1); if (y & 1) MT[i] ^= 2567483615; }}int rand(){ if(!isInit) srand((int)time(NULL)); if(index == 0) generate(); int y = MT[index]; y = y ^ (y >> 11); y = y ^ ((y << 7) & 2636928640); y = y ^ ((y << 15) & 4022730752); y = y ^ (y >> 18); index = (index + 1) % 624;return y; //y即为产生的随机数 }int main(){ srand(0); //设置随机种子 int cnt = 0; for(int i=0; i<1000000; i++) //下面的循环是用来判断随机数的奇偶概率的 { if(rand() & 1) cnt++; } cout<<cnt / 10000.0<<"%"<<endl; return 0;}

该代码摘自it610网,该博文包含原理解析。

随机数引擎适配器

随机数引擎适配器生成以另一随机数引擎为熵源的伪随机数,以随机数引擎为基础产生过更为多样性的随机序列。

类模板作用discard_block_engine舍弃随机数引擎的某些输出independent_bits_engine将一个随机数引擎的输出打包为指定位数的块shuffle_order_engine以不同顺序发送一个随机数引擎的输出预定义随机数生成器

如果有需要可以根据上述的随机数引擎和随机数引擎适配器构建属于自己的随机数生成器。同时C++的标准库也提供了需要经典的随机数生成器如下:

类型定义minstd_rand0std::linear_congruential_engine<std::uint_fast32_t, 16807, 0, 2147483647>
由 Lewis、Goodman 及 Miller 发现于 1969,由 Park 与 Miller 于 1988 采纳为“最小标准”minstd_randstd::linear_congruential_engine<std::uint_fast32_t, 48271, 0, 2147483647>
较新的“最小标准”,为 Park、 Miller 及 Stockmeyer 于 1993 推荐mt19937 std::mersenne_twister_engine<std::uint_fast32_t, 32, 624, 397, 31,
                            0x9908b0df, 11,                             
                            0xffffffff, 7,                             
                            0x9d2c5680, 15,                             
                            0xefc60000, 18, 1812433253>
                            32 位内向的天空缠绕器,由松本与西村设计于 1998mt19937_64std::mersenne_twister_engine<std::uint_fast64_t, 64, 312, 156, 31,
                            0xb5026f5aa96619e9, 29,
                            0x5555555555555555, 17,
                            0x71d67fffeda60000, 37,
                            0xfff7eee000000000, 43, 6364136223846793005>
                            64 位内向的天空缠绕器,由松本与西村设计于 2000ranlux24_basestd::subtract_with_carry_engine<std::uint_fast32_t, 24, 10, 24>ranlux48_basestd::subtract_with_carry_engine<std::uint_fast64_t, 48, 5, 12>ranlux24std::discard_block_engine<std::ranlux24_base, 223, 23>
24 位 RANLUX 生成器,由 Martin Lüscher 与 Fred James 设计于 1994ranlux48std::discard_block_engine<std::ranlux48_base, 389, 11>
48 位 RANLUX 生成器,由 Martin Lüscher 与 Fred James 设计于 1994knuth_bstd::shuffle_order_engine<std::minstd_rand0, 256>default_random_engine实现定义随机数分布

处理随机数生成器的输出,以使得输出结果按照定义的统计概率密度函数进行分布。

均匀分布uniform_int_distribution产生在一个范围上均匀分布的整数值uniform_real_distribution产生在一个范围上均匀分布的实数值 伯努利分布bernoulli_distribution产生伯努利分布上的 bool 值binomial_distribution产生二项分布上的整数值negative_binomial_distribution产生负二项分布上的整数值geometric_distribution产生几何分布上的整数值 泊松分布poisson_distribution产生泊松分布上的整数值exponential_distribution产生指数分布上的实数值gamma_distribution产生weibull_distribution产生威布尔分布上的实数值extreme_value_distribution产生极值分布上的实数值 正态分布normal_distribution产生标准正态(ldhm)分布上的实数值lognormal_distribution产生对数正态分布上的实数值chi_squared_distribution产生χ2cauchy_distribution产生柯西分布上的实数值fisher_f_distribution产生费舍尔student_t_distribution产生学生 采样分布discrete_distribution产生离散分布上的随机整数piecewise_constant_distribution产生分布在常子区间上的实数值piecewise_linear_distribution产生分布在定义的子区间上的实数值其他工具

std::uniform_random_bit_generator :均匀随机位生成器是函数对象,它返回无符号整数值,并使得每个值在可能结果的范围中拥有(理想上)相等的被返回概率。

std::random_device :使用硬件熵源的非确定随机数生成器

std::generate_canonical : 使通过随机数生成器获得的数据均匀分布在 [0, 1) 上

seed_seq :通用的偏差消除的混淆种子序列生成器,通过提高种子的多样性降低随机序列的重复出现

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。