srand函数

摘要:
Srand函数是随机数生成器的初始化函数。提问srand直接使用1初始化种子。回答计算机的随机数是伪随机的,即通过某种算法获得一个数字序列,然后每个rand()取一个数字。srand()的功能是设置生成随机数的公式的参数。如果使用相同的种子,则获得的随机数将相同。那么如何使用rand生成真正的“随机数”呢?答案是通过srand使随机数的种子随时间变化。
srand函数是随机数发生器的初始化函数。
  原型:void srand(unsigned seed);
  用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数。如: srand(1); 直接使用1来初始化种子。不过为了防止随机数每次重复常常使用系统时间来初始化,即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即: srand((unsigned) time(&t)); 还有一个经常用法,不需要定义time_t型t变量,即: srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。srand((int)getpid()); 使用程序的ID(getpid())来作为初始化种子,在同一个程序中这个种子是固定的。
追问
srand(1)直接使用1来初始化种子。不过为了防止随机数每次重复常常使用系统时间来初始化//初始化为srand(0)呢?也会随机数重复?你说的重复是 重复出现初始化的数?所以传时间进去,
要是随即时间,传数进去?
上面程序要改成srand((unsigned) time(&t));//直接加上这句就行?
回答
电脑的随机数都是伪随机,也就是通过一定的算法得出一个数列,然后每 rand()一次就取一个数。
而srand()的功能就是就是设置产生随机数的公式的参数(随机数种子),如果使用相同的种子,那么得到的随机数也就是相同的。自然,如果使用不同的种子,得出的随机数序列也是不同的。
不同的种子会得到 固定 的 不同的随机数序列。

例如:
void main()
{
srand(1);
cout<<rand()<<endl;
cout<<rand()<<endl;
srand(1);
cout<<rand()<<endl;
cout<<rand()<<endl;
srand(2);
cout<<rand()<<endl;
cout<<rand()<<endl;
srand(2);
cout<<rand()<<endl;
cout<<rand()<<endl;
}
输出结果:
41
18467
41
18467
45
29216
45
29216
由于通过srand(1)和srand(2)设置了不同的随机数种子
搜索

所以产生了两组不同的随机数,这组数与种子相对应。

那么怎么利用rand产生真正的“随机数”呢?
答案是通过srand(time(NULL))使得随机数种子随时间的变化而变化。
PS:time函数可以获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。

免责声明:文章转载自《srand函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android : android 8.0 audio 接口分析在IntelliJ IDEA中使用Git下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【STM32H7教程】第72章 STM32H7的SPI总线基础知识和HAL库API

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第72章       STM32H7的SPI总线基础知识和HAL库API 本章节为大家讲解SPI(Serial peripheral interface)总线的基础知识和对应的HAL库API。 72.1 初学者重要提示 7...

CGO 类型(CGO Types) 一

CGO TypesC作为一种混合编程语言已经很久了,无论那些广泛使用的包是用何种语言实现的,都导出了和C兼容的API。Go程序调用C程序,可以借助两种工具实现,一种是cgo,另一种是SWIG工具。Cgo是为C函数创建go绑定的工具;SWIG工具可以提供更复杂的特性来调用C++程序。(关于SWIG工具的使用,可以参考以前的《calling c++ from...

linux c libcurl的简单使用(转)

curl是Linux下一个非常著名的下载库,通过这个库,可以很简单的实现文件的下载等操作。看一个简单的例子: 1 #include <curl/curl.h> 2 #include <stdio.h> 3 #include <string.h> 4 5 CURL *curl; 6 CURLcode...

【python系统学习13】类(class)与对象(object)

目录: 类(class)和实例 类 实例 小测试 对象(object) 属性和方法 类的创建 伪代码 示例代码 属性(attribute) 方法(method) 类的实例化 实例对象调用类属性和方法 调用类的属性 调用类的方法 示例代码 特殊参数:self 1、代指实例化对象的作用 2、定义方法必传self 3、调用方法传参时sel...

linux下/etc/rc.d目录的介绍及redhat启动顺序

init inittab rc0 rc1 rc2 rc3 rc5 rc6 rcS init.dinit 系统启动超级进程inittab 进程启动配置文件rc0 - rc6 各启动级别的启动脚本rcS 单用户模式启动脚本init.d 启动脚本存放目录 init目录有时候是直接在/etc目录下的,/etc目录下有时候也有inittab 、rc0~6等目录,不过...

Socket与系统调用深度分析

一、系统调用 什么是系统调用呢? 来了解这个问题之前我们先来分析一下什么是用户态,什么是内核态。用户态是非特权状态,简单来说,就是不允许执行某些可能存在危险的操作的状态,在这种状态下,进程只能在各自的用户空间当中运行。内核态也就是特权状态,也就是具有可以具有权限来执行某些可能存在危险的操作。当一个进程执行系统调用,由于这个进程在用户态下没有足够的权限,那么...