伪随机数产生原理及用法
一、 C++ 中不能使用 random() 函数 , random 函数不是 ANSI C 标准,不能在 gcc,vc 等编译器下编译通过。可改用 C++ 下的 rand 函数来实现。
1 、 C++ 标准函数库提供一随机数生成器 rand ,返回 0 - RAND_MAX 之间均匀分布的伪随机整数。 RAND_MAX 必须至少为 32767 。 rand() 函数不接受参数,默认 seed 为 1 ,程序调用一次后将改变。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
2 、 C++ 中另一函数 srand (),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。
3 、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time 的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
// C++ 随机函数( VC program )
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;
#define MAX 100
int main(int argc, char* argv[])
{ srand( (unsigned)time( NULL ) );//srand() 函数产生一个以当前时间开始的随机种子 . 应该放在 for 等循环语句前面 不然要很长时间等待
for (int i=0;i<10;i++)
cout<<rand()%MAX<<endl;//MAX 为最大值,其随机域为 0~MAX-1
return 0;
}
二、 rand() 的用法
rand() 不需要参数,它会返回一个从 0 到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。 这样,如果你要产生 0~10 的 10 个整数,可以表达为:
int N = rand() % 11;
这样, N 的值就是一个 0~10 的随机数,如果要产生 1~10 ,则是这样:
int N = 1 + rand() % 11;
总结来说,可以表示为:
a + rand() % n
其中的 a 是起始值, n 是整数的范围。 a + rand() % (b-a+1) 就表示a~b之间的一个随机数。
若要 0~1 的小数,则可以先取得 0~10 的整数,然后均除以 10 即可得到随机到十分位的 10 个随机小数,若要得到随机到百分位的随机小数,则需要先得到 0~100 的 10 个整数,然后均除以 100 ,其它情况依此类推。
另一种小数的产生方法。 用 rand() / double(RAND_MAX) 可以取得 0 ~ 1 之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例:
double ran_numf=0.0;
srand((unsigned)time(0));
for(int i=0;i<10;i++){
ran_numf = rand() / (double)(RAND_MAX);
cout<<ran_numf<<" ";
}
运行结果为: 0.716636 , 0.457725 , … 等 10 个 0 ~ 1 之间的浮点数,每次结果都不同。
如果想取更大范围的随机浮点数,比如 1 ~ 10 ,可以将
rand() /(double)(RAND_MAX) 改为 rand() /(double)(RAND_MAX/10)
运行结果为: 7.19362 , 6.45775 , … 等 10 个 1 ~ 10 之间的浮点数,每次结果都不同。
至于 100 , 1000 的情况,如此类推。
通常 rand() 产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。若要产生每次不同的随机数,可以使用 srand( seed ) 函数进行随机化,随着 seed 的不同,就能够产生不同的随机数。
如大家所说,还可以包含 time.h 头文件,然后使用 srand(time(0)) 来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列 ( 只要两次运行的间隔超过 1 秒 ) 。
参考资料:
《伪随机数 _ 百度百科》 http://baike.baidu.com/view/1127.htm
C++中如何产生随机数 http://hi.baidu.com/skywind_21flying/blog/item/fd2cef62b3e68adce6113aa7.html
C++ 中用 rand() 和 srand() 产生为随机数方法 http://hi.baidu.com/sdood/blog/item/4737297f573c8d0a28388a9c.html
伪随机数产生原理及用法相关推荐
- mysql 实时聚合分析,mysql累积聚合原理与用法实例分析
本文实例讲述了mysql累积聚合原理与用法.分享给大家供大家参考,具体如下: 累积聚合为聚合从序列内第一个元素到当前元素的数据,如为每个员工返回每月开始到现在累积的订单数量和平均订单数量 行号问题有两 ...
- python装饰器原理-Python装饰器原理与用法分析
这篇文章主要介绍了Python装饰器原理与用法,结合实例形式分析了Python装饰器的概念.原理.使用方法及相关操作注意事项,需要的朋友可以参考下 本文实例讲述了Python装饰器原理与用法.分享给大 ...
- python的编程模式-Python设计模式之状态模式原理与用法详解
本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...
- python装饰器原理-Python函数装饰器原理与用法详解
本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...
- python装饰器原理-python装饰器原理与用法深入详解
本文实例讲述了python装饰器原理与用法.分享给大家供大家参考,具体如下: 你会Python嘛? 我会! 那你给我讲下Python装饰器吧! Python装饰器啊?我没用过哎 以上是我一个哥们面试时 ...
- python定义私有变量的方法_Python面向对象程序设计之私有变量,私有方法原理与用法分析...
本文实例讲述了Python面向对象程序设计之私有变量,私有方法原理与用法.分享给大家供大家参考,具体如下: 私有变量,私有方法:python的私有化是为了规划私有属性,避免非相关的访问[假如!我有老婆 ...
- mysql 实时聚合分析_mysql滑动聚合/年初至今聚合原理与用法实例分析
本文实例讲述了mysql滑动聚合/年初至今聚合原理与用法.分享给大家供大家参考,具体如下: 滑动聚合是按顺序对滑动窗口范围内的数据进行聚合的操作.下累积聚合不同,滑动聚合并不是统计开始计算的位置到当前 ...
- java 字节缓冲_Java字节缓冲流原理与用法详解
本文实例讲述了Java字节缓冲流原理与用法.分享给大家供大家参考,具体如下: 一 介绍 BufferInputStresm和BufferOutputStream 这两个流类为IO提供了带缓冲区的操作, ...
- mysql的存储过程原理_mysql存储过程原理与用法详解
本文实例讲述了Mysql存储过程原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是存储过程 存储过程的创建 存储过程的使用 查看存储过程 修改存储过程 删除存储过程 首发日期:2018- ...
- python异常处理_汇总三大python异常处理、自定义异常、断言原理与用法分析
本文实例讲述了python异常处理.自定义异常.断言原理与用法.分享给大家供大家参考,具体如下: 什么是异常: 当程序遭遇某些非正常问题的时候就会抛出异常:比如int()只能处理能转化成int的对象, ...
最新文章
- ROS关于cv_brige的使用
- 企业智能化升级之路:CSDN《2017-2018中国人工智能产业路线图V1.0》重磅发布
- Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )
- FPGA篇(十一)modelsim命令行仿真提示“vsim 不是内部或外部命令,也不是可运行的程序或批处理文件”的解决办法 (转)
- es 精确查询不模糊_ES系列17:Terms聚合结果不精确,怎么破?
- Rowkey设计_HBase表设计
- 数据结构——排序算法(含动态图片)
- Swing应用程序中的CDI事件可将UI与事件处理分离
- oracle数据库相关知识,Oracle数据库相关知识点复习
- C++中1LL避免强制转换
- `json in遍历
- 基于react/vue的移动端终极适配方案(更新css-modules配置)
- matlab 遗传算法 ga函数,matlab遗传算法ga函数
- 2019年全国大学生电子竞赛 | 电磁炮制作教程
- git Untracked Files Prevent Rebase
- geek软件是干什么的_Geek软件下载工具使用说明.pdf
- octobercms mysql_OctoberCMS插件形成数据库关系(OctoberCMS plugin form database relationships)...
- Solidwork软件盗版
- AirDroid免root操作步骤
- InterConnect 和SmartConnect
热门文章
- 渐近记号Θ、Ο、o、Ω、ω详解
- 游鸿明歌曲白色恋人浅析
- Win7文件夹怎么加密
- 用ffmpeg把yuv格式转化为mpeg格式
- 修改记录-优化后(springboot+shiro+session+redis+ngnix共享)
- 基于python的客流统计_基于深度学习的客流量统计方法
- 思维导图组件@hellowuxin/mindmap的基本使用
- 计算机桌面机器人,桌面的 Spirit Rover(勇气号探测器),机器人爱好者的心头好!!...
- 孙德顺敛财10亿,看图挖掘计算如何穿透与识别多层嵌套影子公司!
- 全栈工程师是什么,为什么需要全栈工程师?