rand()函数是C++标准函数库提供的随机数生成器,生成0-RAND_MAX之间的一个“伪随机”整数,理论上可以产生的最大数值为2^16-1,即32767。

rand()函数不接受参数,默认以1为种子(seed,即起始值),这里的种子在随机数产生的过程中起了很大的作用,甚至可以说是起了决定性的作用。

rand()=41?

了解了这些让我们试着生成一个随机数
#include<iostream>

using namespace std;

int main(int argc,char*argv[])
{
int randValue=rand();
cout<<randValue<<endl;
system("pause");
}



第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个随机数:




其实这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日开始到程序被运行时刻的总秒数。



如何生成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)个互不重复的随机数:



 

每次rand出来都是41?说好的随机数呢?!的更多相关文章

  1. github每次推送都要输入用户名和密码

    /***************************************************************************** * github每次推送都要输入用户名和密 ...

  2. 【排障】每次打开word都提示要安装配置

    为什么每次打开word都提示要安装配置?很多人在打开word时,总是提示要安装配置一遍,花去不少时间,这是由于电脑里有两个不同版本的office软件,产生的原因可能是原来的卸载了没卸载干净,或是安装了 ...

  3. 每次打开VS都报错:我们无法自动填充你的 Visual Studio Team Services 帐户

    我们无法自动填充你的 Visual Studio Team Services 帐户.遇到下面的错误: TF400813: Resource not available for anonymous ac ...

  4. javashop每次重新部署都要从新安装的问题

    javashop每次重新部署都要从新安装的问题 发现一个问题就是用MyEclipse是部署不上的,用eclipse才行. 这个问题的关键在于javashop有好多文件都是动态生成的,好多配置文件也是在 ...

  5. appium+python解决每次运行代码都提示安装Unlock以及AppiumSetting的问题

    appium+python解决每次运行代码都提示安装Unlock以及AppiumSetting的问题(部分安卓机型) 1.修改appium-android-driver\lib下的android-he ...

  6. 解决Deepin每次打开Chome都提示解锁登录密钥环的麻烦

    密钥环是linux系统用于安全保存程序私密数据的模块,可以用于加密保存密码.证书.密钥等安全数据.chrome的密钥环用于保存本地访问站点密码或缓存从google服务器同步下来的访问站点的密码. De ...

  7. 安装mysql5.7后无法启动,/var/run/mysqld 目录每次重启后都需要手动去创建--终极解决方案

    鉴于很多童鞋反应,mysql5.7安装后出现无法启动,建立/var/run/mysqld 并赋权mysql用户解决了启动的问题,但是重启系统后又出现无法启动的问题,导致/var/run/mysqld ...

  8. Deepin系统关于每次启动终端都要输入source /etc/profile的问题

    关于每次启动终端都要输入source /etc/profile的问题 当我在Deepin系统中下载了node以及npm之后,我为了将node导入到系统文件,使用了以下命令sudo gedit ``/e ...

  9. win7下每次打开Excel2007都提示向程序发送命令时出现问题的解决方案

    每次打开Excel2007都提示向程序发送命令时出现问题,要打开两次才可以打开,下面介绍该问题的解决办法. 第一种情况:也就是屏蔽DDE的解决方案,这是大多数人都是这种情况,该情况的解决办法: exc ...

随机推荐

  1. .net core webapi jwt 更为清爽的认证 ,续期很简单

    我的方式非主流,控制却可以更加灵活,喜欢的朋友,不妨花一点时间学习一下 jwt认证分为两部分,第一部分是加密解密,第二部分是灵活的应用于中间件,我的处理方式是将获取token放到api的一个具体的co ...

  2. Android studio 导入githubproject

    Blog From:http://blog.csdn.net/onlysnail/article/details/45115093 从github下载两个开源项目: PagerSlidingTabSt ...

  3. $.ajax里一个中文全角逗号引发的惨案

    昨天,在制作一个页面时,突然发生一件不可思议的事情--JS失效了! 确实让人匪夷所思,我记得饭前还是正常运作的. 于是慢慢的缩小范围,把下午刚加的语句删掉,删完了页面就正常了. 于是被删除的这部分代码 ...

  4. nrf51822中app_button 的应用

    Button Handler(按键处理程序) 按键处理程序是使用GPIOTE(GPIO Task and Event)的处理机制实现的,为了防止按键的抖动.在GPIOTE event(事件)处理程序中 ...

  5. weex 项目开发(二) weex 与 weexpack 的区别

    1.weex 与 weexpack 即  weex-toolkit 与 weexpack 的区别 weex-toolkit 初始化的项目是针对开发单个 Weex 页面而设计的,也就是说这样的项目只包括 ...

  6. NDK编译STL

    方法: 1.在jni目录下新建Application.mk; 加入 APP_STL :=  stlport_static  右边的值还可以换成下面几个: system - 使用默认最小的C++运行库, ...

  7. jQuery Ajax Post Data Example

    http://www.formget.com/jquery-post-data/ jQuery Ajax Post Data Example Fugo Of FormGet jQuery $.post ...

  8. c/c++中static和extern使用

    c/c++中static和extern使用 在C/C++中static和extern都能够用来修饰函数和变量,可是是有差别的. 内部函数和内部变量:仅仅能在文件内使用的函数和变量. 外部函数和外部变量 ...

  9. 初识glib(1)

    最近搞DLNA,发现download的源码有许多glib库的使用.于是在Ubuntu中安装了glib库,以及简单测试了一些glib库函数,以此增加对glib的了解. 概述:glib库是Linux平台下 ...

  10. android自己定义开关控件

    近日在android项目要使用开关控件.可是android中自带的开关控件不太惬意,所以就打算通过自己定义View写一个开关控件 ios的开关控件当然就是我要仿照的目标. 先上图:   waterma ...