每次rand出来都是41?说好的随机数呢?!
2016-11-14 00:00
323 查看
rand()函数是C++标准函数库提供的随机数生成器,生成0-RAND_MAX之间的一个“伪随机”整数,理论上可以产生的最大数值为2^16-1,即32767。
rand()函数不接受参数,默认以1为种子(seed,即起始值),这里的种子在随机数产生的过程中起了很大的作用,甚至可以说是起了决定性的作用。
![](https://static.oschina.net/uploads/img/201611/14200805_0zSI.jpg)
第1次运行,输出41,第2次运行,输出41,第3、4……次输出仍然是41!说好的rand()产生一个0~32767间的随机整数呢?
这里就遗漏了上边提到的“种子”的概念,计算机从算法层面,不可能产生真正的随机数,它只能按照一定的算法定义,生成一系列固定顺序的伪随机数,这就是所谓随机中的规律。rand()函数的实现可以抽象描述成这样:
这里的A、B、n都是常量值,所以这就意味着rand()产生的随机数就唯一取决于种子seed的值,在我们没有定义初始值的情况下,系统默认给出seed值为1,这就是为什么每次rand出来的值固定都是41的原因。
如果想生成一系列随机数,仍然可以这样:
生成10个随机数:
![](https://static.oschina.net/uploads/img/201611/14200805_7bL2.jpg)
其实这10个数的值和排列顺序是固定的,即你知道了这开头,你也可以猜到这结尾。
要想打破这一规律,可以使用种子发生器。
srand()可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数序列也会相同,比较理想的是使用随时会变化的数,常用时间作为随机数生成器的种子。
time(0)的值是从1970年1月1日开始到程序被运行时刻的总秒数。
![](https://static.oschina.net/uploads/img/201611/14200806_rrbQ.jpg)
首先定义一个包含N个int类型元素的向量arrayInt,以0为第一个元素,从小到大依次排列,调用随机函数Randarrary后,依次把每次生成的随机元素跟参与随机运算的第一个元素对调。函数调用的结果是arrayInt向量内保存了0~N内的(N-1)个互不重复的随机数:
rand()函数不接受参数,默认以1为种子(seed,即起始值),这里的种子在随机数产生的过程中起了很大的作用,甚至可以说是起了决定性的作用。
rand()=41?
了解了这些让我们试着生成一个随机数#include<iostream> using namespace std; int main(int argc,char*argv[]) { int randValue=rand(); cout<<randValue<<endl; system("pause"); }
![](https://static.oschina.net/uploads/img/201611/14200805_0zSI.jpg)
第1次运行,输出41,第2次运行,输出41,第3、4……次输出仍然是41!说好的rand()产生一个0~32767间的随机整数呢?
这里就遗漏了上边提到的“种子”的概念,计算机从算法层面,不可能产生真正的随机数,它只能按照一定的算法定义,生成一系列固定顺序的伪随机数,这就是所谓随机中的规律。rand()函数的实现可以抽象描述成这样:
int rand() { static int seed=XX; return seed=A*seed+B*n; }
这里的A、B、n都是常量值,所以这就意味着rand()产生的随机数就唯一取决于种子seed的值,在我们没有定义初始值的情况下,系统默认给出seed值为1,这就是为什么每次rand出来的值固定都是41的原因。
如果想生成一系列随机数,仍然可以这样:
#include<iostream> using namespace std; int main(int argc,char*argv[]) { int randValue[10]; for(int i=0;i<10;i++) { randValue[i]=rand(); cout<<randValue[i]<<endl; } system("pause"); }
生成10个随机数:
![](https://static.oschina.net/uploads/img/201611/14200805_7bL2.jpg)
其实这10个数的值和排列顺序是固定的,即你知道了这开头,你也可以猜到这结尾。
要想打破这一规律,可以使用种子发生器。
srand()种子生成器
既然种子这么重要,如何定义种子呢?答案是使用C++中另一个为rand()而生的函数—srand()。srand()可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数序列也会相同,比较理想的是使用随时会变化的数,常用时间作为随机数生成器的种子。
#include<iostream> #include <time.h> using namespace std; int main(int argc,char*argv[]) { int randValue[10]; srand(time(0)); cout<<"本次所用种子为: "<<time(0)<<endl; for(int i=0;i<10;i++) { randValue[i]=rand(); cout<<randValue[i]<<endl; } system("pause"); }
time(0)的值是从1970年1月1日开始到程序被运行时刻的总秒数。
![](https://static.oschina.net/uploads/img/201611/14200806_rrbQ.jpg)
如何生成0~N间(N-1)个互不重复的随机数?
#include<iostream> #include <time.h> #include<vector> using namespace std; //定义需要生成的随机数数量 #define Number 15 void Randarrary( vector<int>& arrarInt) ; int main(int argc,char*argv[]) { vector<int> arrarInt; for(int i=0;i<Number;i++) { arrarInt.push_back(i); } Randarrary(arrarInt); for(int i=0;i<Number;i++) { cout<<"第 "<<i<<" 个不重复的随机数是"<<arrarInt[i]<<endl; } system("pause"); } //*******************************************************************// //生成N个互不重复的随机数函数 //*******************************************************************// void Randarrary( vector<int>& arrarInt) { for(int i=0;i<arrarInt.size();i++) { srand(int(time(0))); int a=rand()%(arrarInt.size()-i)+i; swap(arrarInt[i],arrarInt[a]); } }
首先定义一个包含N个int类型元素的向量arrayInt,以0为第一个元素,从小到大依次排列,调用随机函数Randarrary后,依次把每次生成的随机元素跟参与随机运算的第一个元素对调。函数调用的结果是arrayInt向量内保存了0~N内的(N-1)个互不重复的随机数:
![](https://static.oschina.net/uploads/img/201611/14200806_BgcV.jpg)
相关文章推荐
- 每次rand出来都是41?说好的随机数呢?!
- rand()为啥每次生成的数都是一样的
- C++随机数 (rand srand)用法,注意随机数种子每次要更新。
- rand()每次产生的随机数都一样
- 为什么rand()每次产生的随机数都一样
- 关于“使用rand()产生的随机数每次得到的结果相同”的问题
- 安卓开发错误录,1年时间总结出来的,所有的东西都是亲自踩坑,主要自己看,有需要的也可以看看
- JMeter特殊情况二:针对某些请求数据每次请求都是变化的情况
- 用rand()和srand()产生为随机数的方法总结(转)
- $表示jquery,jquery对象都是通过$()函数构造出来的,就是一个jquery对象的构造工厂
- Java eclipse怎么创建子包,感觉创建出来的都是同级包.
- 随机数 rand()与srand()的区别
- C/C++中产生随机数(rand,srand用法)
- 解决每次打开Eclipse,当前workspace都是C盘下的workspace的问题
- 随机数生成函数 srand() rand()
- JMeter特殊情况二:针对某些请求数据每次请求都是变化的情况
- 感觉rand产生的不是标准的随机数啊
- 用MySQL里的Rand()生成 不连续重复 的随机数年龄以及随机姓名字符串
- 不要听吹牛逼什么前端MVVM框架就是好,其实都是一帮没学好分层设计的搞出来的,让你彻底看清前端MVVM的本质
- 用rand()和srand()产生为随机数的方法总结,