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. PHP提示Cannot modify header information - headers already sent by解决方法

    PHP提示Cannot modify header information - headers already sent by解决方法 因为 header();发送头之前不能有任何输出,空格也不行, ...

  2. AC日记——[USACO1.1]坏掉的项链Broken Necklace 洛谷 P1203

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  3. seo优化入门教程:认识搜索引擎

    对于从来没有学过seo或者零基础的人来说,搜索引擎可能都不太了解.所以我们先来认识搜索引擎有哪些,同时为什么我们要学习搜索引擎优化. 从目前全球的一个搜索引擎来说的话,他的分支是非常多的,甚至可以讲, ...

  4. Spring 详解(二)------- AOP关键概念以及两种实现方式

    目录 1. AOP 关键词 2. AOP 的作用 3. AOP 的通知类型 4. 基于 xml 的配置方式 5. 基于注解的配置方式 6. 切面的优先级 7. 重用切点表达式 8. 两种方式的比较(摘 ...

  5. nodejs启动前端项目步骤

    在.nuxt目录下打开命令行: 一:npm rm node-sass 二:npm install node-sass 三:npm install 四:npm run dev

  6. 微软自带的异步Ajax请求

    一.使用步骤 二.示例代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; u ...

  7. 浅析keepalived vip漂移原理与VRRP协议

    2017-01-18 Martin 开源技术社区 简介 什么是keepalived呢?keepalived是实现高可用的一种轻量级的技术手段,主要用来防止单点故障(单点故障是指一旦某一点出现故障就会导 ...

  8. 关于button中设置文字不显示的问题

    这个因为使用的image加载方式是setimage而不是setbackgroundimage导致文字始终出不来.

  9. Linux的SOCKET编程详解(转)

    Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...

  10. eclipse 配置执行hadoop 2.7 程序样例參考步骤

    前提:你搭建好了hadoop 2.x的linux环境,并可以成功执行.还有就是window可以訪问到集群.over 1. hfds-site.xml 添加属性:关闭集群的权限校验.windows的用户 ...