c++生成随机数

一.获取均匀分布的随机数###经典方法:


#include<stdlib.h>
// 产生随机数,范围在0~RAND_MAX之间,RAND_MAX在stdlib中,其值为2147483647
rand();
  • rand的机制是根据一个随机数种子(通常是一个整数值,如果没有设置,则为默认值)来生成一系列指定顺序的随机数,如果种子相同,那么一系列的随机数也是相同的。所以如果你rand();后再rand();就会得到一样的。

原理:Srand ( );Rand( );函数。它本质上是利用线性同余法,y=ax+b(mod m);其中a,b,m都是常数。因此rand的产生决定于x,x被称为Seed。

  • 可以通过srand()来设置随机数种子。较为普遍的做法是将随机数种子设为time()的时间函数,这样就能根据当前的时间来设置随机数种子,不会存在重复的问题。
  • time()包含在time.h中,返回从一个特定时刻到现在经过了多少秒,它接受单个指针参数,用于指向写入时间的数据结构,若为空,则简单的返回时间。用于产生随机数种子通常用time(0);
  • 如果你要获取一定范围内的随机数,rand() % MAX,MAX为你设置的范围。可以#define random(x) (rand()%x)来简化使用过程,使用时就直接rand(max);就好了

c++11中的新标准:

#include<random>
// 随机数库:由引擎类和分布类组成
std::default_random_engine e;// 随机数引擎,生成随机无符号数e();
// 取出队列头的随机数
  • 和rand()函数类似,也是依靠随机数种子,种子可以在初始化时指定std::default_random_engine e(seed);(seed为整型值);也可以调用seed()成员函数指定e.seed(seed);
  • 标准库定义了多个随机数引擎类,区别在于性能和随机性质量不同,每个编译器都会指定其中一个作为default_random_engine类型。此类型一般具有最常用的特性。有兴趣的请自行了解“标准库随机数引擎”。
随机数引擎操作 介绍
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

参考:c++primer第5版中文版P660,英文P746


二.获取任意分布的随机数

经典:

  • 分布得靠自己去处理

example指数分布:

double cls_random::randomExponential( double lambda){ double pV = 0.0; 
while(true) { 
pV = (double)rand()/(double)RAND_MAX; 
if (pV != 1) { break; } } pV = (-1.0/lambda)*log(1-pV); return pV;}

期望:E=\lambda{-1}\ 方差:V=\lambda{-2}
此方法的参考网址


c++11新标准:

  • 标准库定义了一系列的分布类型,分布就是在随机数引擎产生的随机数的基础上进行过滤调整,以符合一定的规律,下面以正态分布的使用为例

example

#include <iostream>
#include <random>
#include <string>
using namespace std;
int main(){ 
default_random_engine e;// 生成随机整数 normal_distribution<double> n(4,1.5);// 均值4,标准差1.5 
int vals[9]; 
for(size_t i = 0;i != 200;i++) {
// n(e)得到正态分布的double值 
// lround将double舍入到最近的整型值 
int v = lround(n(e)); 
if(v<9)//如果结果在范围内 { ++vals[v];// 统计每个数出现了多少次 } }  for(int j = 0;j != 9;j++ ) { // 打印每个数出现的频率 cout<< j << ":" << string(vals[j], '*') <<endl; }}

输出结果:

0:***
1:***********
2:******************
3:********************************************
4:*******************************************************
5:********************************
6:******************************
7:*****
8:*


附录###

随机数分布

分布类 介绍
均匀分布:
uniform_int_distribution<IntT> u(m,n) 均匀分布的模板类,m为生成的最小值,n最大,生成int
uniform_real_distrubution<RealT> u(x,y) 同上,生成double
伯努利分布:
bernoulli_distribution b(p) 伯努利分布,以给定概率p生成true,默认0.5
binomial_distribution<IntT> b(t,p) 按采样大小为整型值t,概率为p生成的;t默认1,p默认0.5
geometric_distribution<IntT> g(p) 每次实验成功的概率为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给出,lan默认为1.0
gamma_distribution<RealT> e(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,s默认1.0
lognarmal_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是输入迭代器

随机数引擎

随机数引擎
随机数引擎
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • rand() 生成一个0~RAND_MAX的随机数 RAND_MAX的范围最少是在32767之间(int)。用un...
    DeepWeaver阅读 762评论 0 0
  • 1.问题; 按照网上的方法 private Random rm; rm =new Random(); privat...
    大魔王是本人阅读 4,172评论 0 0
  • 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math...
    GB_speak阅读 40,955评论 2 6
  • 本文根据众多互联网博客内容整理后形成,引用内容的版权归原始作者所有,仅限于学习研究使用,不得用于任何商业用途。 随...
    深红的眼眸阅读 2,200评论 0 0
  • 芒种即忙种,谷黍播田陇;忙种亦忙收,割麦正时候。记忆中,每当芒种来临之时,正是农民们最忙的时节,也是众多学子高考之...
    宁博Villa阅读 555评论 1 4