当前位置: 首页 > news >正文

美国网站服务器宁波seo软件免费课程

美国网站服务器,宁波seo软件免费课程,榆林公司做网站,郑州公司企业网站建设c语言中可以用rand()函数生成随机数,今天来探讨一下rand()函数的基本用法和实际应用。 本系列文章共分两讲,今天主要介绍一下伪随机数生成的原理,以及在伪随机数生成的基础上,生成随机数的技巧,下一讲主要介绍无重复随…

c++语言中可以用rand()函数生成随机数,今天来探讨一下rand()函数的基本用法和实际应用。

本系列文章共分两讲,今天主要介绍一下伪随机数生成的原理,以及在伪随机数生成的基础上,生成随机数的技巧,下一讲主要介绍无重复随机数生成的方法和舒尔特方格数字生成的实例。本文采用循序渐进的方式逐步介绍,并且贴上了实际测试的代码和结果。有不详和不实之处,请各位大神批评指正。

 

目录

一、rand()函数的几个要点

1、rand()函数所在库

2、rand()函数的范围

3、rand()函数为伪随机数

4、线性同余算法简介

二、rand()函数的基本使用技巧

1、单独使用

2、配合srand()函数使用

(1)srand()函数原型

(2)所在库也是cstdlib

(3)srand()的作用

3、配合time()或getpid()使用

(1)time(NULL)函数

(2)getpid()函数

三、rand()函数的扩展功能

1、生成0~n(n>1)随机整数

2、生成n~m(n1)范围内的随机整数,m-n>


一、rand()函数的几个要点

1、rand()函数所在库

rand()函数原型:int rand(void); 

所在的库为cstdlib,所以使用时需要引入cstdlib头文件。

2、rand()函数的范围

当为int型时,随机数的范围为0~32767。

3、rand()函数为伪随机数

rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。

4、线性同余算法简介

线性同余算法是一种迭代算法,每次迭代计算出的结果就是伪随机数,其迭代公式为:

x_{n+1}=(a*x_{n}+c) mod(m)                                                                    (1)                      

式中:

x_{n+1}为第n+1次迭代值;

x_{n}为第n次迭代值;

ac为常数;

m为随机数范围(由rand()数据类型确定,如果为int,则为32768);

公式第一次迭代

x_{1}=(a*x_{0}+c) mod(m)

所用的x_{0}为初始值,也称为种子(seed),也就是acm都确定后,随机数的序列是由x_{0}值决定的,而系统默认其值为1

二、rand()函数的基本使用技巧

1、单独使用

单独使用rand()函数示例代码如下:

#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;int main()
{while(1){cout<<rand()<<endl;Sleep(1000);	}	
}

经过多次测试,发现这样一个规律,每次运行程序时,产生的随机数序列都是一样的,都固定不变为[41,18467,6334,26500,...],如下图所示。因为我们在程序中没有设定x_{0},而系统默认值为1,所以根据(1)式算出来的为随机数序列值都是一样的。

41
18467
6334
26500
19169
15724
11478
29358
26962
24464
5705
28145
23281
16827
9961
491

2、配合srand()函数使用

(1)srand()函数原型

void srand (usigned int seed)

(2)所在库也是cstdlib

(3)srand()的作用

用来设置rand()产生随机数时的随机数种子。参数seed是整数,当改变seed值时,产生的伪随机数序列就会发生改变。在程序中设定seed=0,如下所示。

#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;int main()
{while(1){srand(0);cout<<rand()<<endl;Sleep(1000);	}	
}

运行程序后,发现伪随机数序列发生变化了,如下图所示。

38
7719
21238
2437
8855
11797
8365
32285
10450
30612

3、配合time()或getpid()使用

使用srand()函数,改变seed数值,可以改变伪随机数的序列。每次要想生成不同的伪随机数序列,就要手动改变seed值,也不是很方便。所以,最好的办法是每次运行程序,seed值都可以自动改变。通常可以利用time(NULL)或getpid()的返回值作为seed。

(1)time(NULL)函数

time(NULL)的返回值为当前时间的时间戳(以秒为单位),比如2023-8-2 17:19:04对应的时间戳数值为1690967944。所以每次运行时间不一样,通过srand()函数给rand()函数设定的seed的值x_{0}也不一样,因此产生的随机数序列也就不一样了。

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>using namespace std;int main()
{srand(time(NULL));while(1){cout<<rand()<<endl;Sleep(1000);}}

下边是两次运行的结果,可见产生的随机序列不一样了。

28572
10647
18752
10924
2469
21939
7821
17697
30059
16936
9742
13113
23443
17313
28729
2282
24264
19083
6048
13814
26147
8260
3416
16741
2642
15228
4765
25104
30495
26600

(2)getpid()函数

getpid是一种函数,功能是取得进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。

getpid()函数需要引入的头文件有stdio.h、unistd.h和sys/types.h。

调试程序代码如下:

#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
using namespace std;int main()
{srand(getpid());while(1){cout<<rand()<<endl;Sleep(1000);	}	
}

分别执行两次程序生成的伪代码随机数序列也不相同,结果如下:

5721
5487
18939
28251
29922
6470
2914
16807
14781
32440
28228

15685
28899
30711
4193
17378
25105
4253
4132
15548
3930
16509
23440
17039

getpid函数与time(NULL)函数不同之处是:

第一、time(NULL)获取的是时间戳值,所以与程序的进程无关,无论进程相同还是不同,只要调取函数的时间不一样,那么生成的seed值就不一样。

第二、getpid函数是程序的进程识别码,所以在同一个程序的进程内多次调用函数,生成的seed值是一样的。只有在不同的进程内调用,seed值才会改变。

三、rand()函数的扩展功能

1、生成0~n(n>1)随机整数

rand()函数生成的随机数范围为0~32767,那么要想让范围变为0~m(m<32767),只需要用rand()对m+1求余即可。

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
using namespace std;int main()
{int m;cin>>m; 
//	srand(getpid());srand(time(NULL));while(1){cout<<rand()%(m+1)<<endl;Sleep(1000);}}

2、生成n~m(n<m,m-n>1)范围内的随机整数

要想让rand()函数生成的随机数范围为n~m(n<m,m-n>1),只需要用rand()对(m-n+1)求余,再加n即可。

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
using namespace std;int main()
{int m,n;cin>>n>>m; 
//	srand(getpid());srand(time(NULL));while(1){cout<<rand()%(m-n+1)+n<<endl;Sleep(1000);}}

(未完待续)

http://www.mmbaike.com/news/82449.html

相关文章:

  • php网站建设制作方案网站建设网站推广
  • 济南网站建设与维护深圳网站建设资讯
  • 企业信息填报系统优化网站排名软件
  • 做头像的网站横杆带字短期培训学什么好
  • 做什么网站吸引人市场营销案例
  • 前端开发教程百度seo新规则
  • 跨境电商亚马逊开店流程网络推广优化平台
  • 相城seo网站优化软件媒体:北京不再公布各区疫情数据
  • 如何建设一个社交网站中国网络营销网
  • 秦皇岛和平大街网站建设百度手机浏览器
  • 公司网站域名注册适合成人参加的培训班
  • 怎样做外贸网站建设搭建网站
  • 手机网站备案如何自己开发一个平台
  • 建设网站要编程bu企业qq邮箱
  • 建网站公司营销型网站建设企业营销策划书如何编写
  • 学校网站建设都是谁做的网站优化推广平台
  • 番禺网站推广sem竞价课程
  • 高端网站建设信息关键词指数批量查询
  • 建设酒店网站ppt企业如何做网站
  • 长沙专业做网站排名百度自动点击器怎么用
  • 对网站有效的优化软件百度一下百度
  • 建设银行手机银行下载seo排名技术教程
  • 网站营销队伍网站建设网络推广seo
  • 去哪里找做网站 的客户广东优化疫情防控措施
  • 网站群建设系统百度搜索引擎广告
  • 河南科技园网站建设竞价托管外包公司
  • 做网站一年需要多少钱免费域名申请个人网站
  • 网站怎么做qq授权登录域名注册时间查询
  • 廊坊网站小姐私做自己有域名怎么建网站
  • m2g网站十大搜索引擎排名