首页 > c++11随机数产生器default_random_engine

c++11随机数产生器default_random_engine

c/c++老版本的rand()存在一定的问题,在转换rand随机数的范围,类型或者分布时,常常会引入非随机性。

定义在 中的随机数库通过一组协作类来解决这类问题:随机数引擎 和 随机数分布类

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

随机数发生器会生成相同的随机数序列这一个特性在调试 中很有用。 

一旦我们调试完毕,我们通常希望每次运行程序都会生成不同的随机结果,可以通过提供一个 种子 来达到这一目的。

有两种设置种子的方式: 

1. 创建引擎对象时提供种子 Engine e(s); 

2. 调用引擎的 seed 成员 e.seed(s);

最常用的是调用系统函数 time , 定义在 ,单位是秒计

default_random_engine e(time(0));    //稍微随机些种子
#include 
#include 
#include 
#include std::vector randomGenerate(const unsigned low, const unsigned high)
{static std::default_random_engine e(time(0));static std::uniform_int_distribution u(low, high);std::vector vec;for (int i = 0; i < 10; i++)vec.push_back(u(e));return vec;
}int main()
{for (int i = 0; i < 10; i++) {std::vector vec = randomGenerate(0, 30);for (auto &i : vec)std::cout << i << " ";std::cout << std::endl;}return 0;
}

或者可以用高斯正态分布

inline float NormalRandom(float mu = 0.f, float sigma = 1.f)
{static std::default_random_engine generator;static std::normal_distribution distribution(mu, sigma);//gaussin distributionreturn distribution(generator);
}

 

更多相关:

  • 经过长期探索,发现一个不需要手动设置线程休眠时间(e.g. std::this_thread::sleep_for(std::chrono::microseconds(1)))的代码: Github: https://github.com/log4cplus/ThreadPool #ifndef THREAD_POOL_H_7e...

  • nth_element(first,nth,last) first,last 第一个和最后一个迭代器,也可以直接用数组的位置。  nth,要定位的第nn 个元素,能对它进行随机访问. 将第n_thn_th 元素放到它该放的位置上,左边元素都小于它,右边元素都大于它. 测试代码: http://www.cplusplus.com...

  • jsoncpp 是一个C++ 语言实现的json库,非常方便得支持C++得各种数据类型到json 以及 json到各种数据类型的转化。 一个json 类型的数据如下: {"code" : 10.01,"files" : "","msg" : "","uploadid" : "UP000000" } 这种数据类型方便我们人阅读以...

  • 问题如下: 已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子 集中的各个元素和为整数target的子集,结果中无重复的子集。 例如: nums[] = [10, 1, 2, 7, 6, 1, 5], target = 8 结果为: [[1, 7], [1, 2, 5], [2, 6], [1, 1, 6]] 同样之前有...

  • 描述arm linux启动的概要过程,以S5PV210(Cortex A8)为例,本文描述第一个阶段。        一、arm linux的引导        uboot在引导arm linux(uImage镜像)到SDRAM之后,通过bootm命令对uImage镜像的64个字节头进行解释,获取linux的entry入口地址,并赋值...