srand()就是给rand()提供种子seed

如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的,

srand(n)

for(10)

rand()
也就是说,以一个固定的数值作为种子是一个缺点。 通常的做法是  以这样一句代码srand((unsigned) time(NULL));来取代,这样将使得种子为一个不固定的数, 这样产生的随机数就不会每次执行都一样了。

1,先看一个例子 
#include <iostream> 
#include <stdlib.h> 
#include <time.h> 
using namespace std; 
int main( void ) 

int i; 
/* Seed the random-number generator with current time so that 
* the numbers will be different every time we run. 
*/ 
srand( (unsigned)time( NULL ) ); 
/* Display 10 numbers. */ 
for( i = 0; i < 10;i++ ) 
printf( " %6d/n", rand() ); 
}

2.关于time.h 
time.h中包含很多有趣的函数,譬如 
char *ctime(long *clock) 
本函数把clock所指的时间(如由函数time返回的时间)转换成下列格式的 
字符串:Mon Nov 21 11:31:54 1983/n/0

#i nclude <iostream> 
#i nclude <stdlib.h> 
#i nclude <time.h> 
using namespace std;

void main() 

time_t t1,t2; 
char getTime[20]; 
char *ptstring=getTime;

int x,count=0; 
x=RAND_MAX; 
cout<<<'/n'; 
t1=time(NULL); 
ptstring=ctime(&t1);

while(count<=100) 

srand( (unsigned)time( NULL ) ); 
x=rand()%50; 
if(x<5) 
continue; 
else 

count++; 
cout<<"the numth is "<<<'/n'; 

}

查看ptstring的值会显示 "Tue Sep 13 16:31:06 2005"

3, 最后说说srand()函数 
void srand(unsigned seed) 初始化随机数发生器

有讨论如下: 
1.C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进ran

d函数的实现中,我觉得至少有三个原因: 
(1)可以高效产生连续的随机数,不用每次都初始化; 
(2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据

做种子,而不是系统时钟; 
(3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不

了程序每次运行都产生同样的一系列随机数而已——有些情况下,这是无所谓的。

事实上有一个更重要的原因: 
作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-》产生的序

列必须是可重现的。 
这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中

使用了和rand()的结果相关的数据,通过一个可控的可重现序列,我们就有机会再现每一

次测试的过程,从而更有效的找到问题的所在。 
所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么

,必须保证你的rand()调用是可重现的。

4,C语言里函数rand()和srand()的用法 - -

rand(void)用于产生一个伪随机unsigned int 整数。 
srand(seed)用于给rand()函数设定种子。

srand 和 rand 应该组和使用。一般来说,srand 是对 rand 进行设置。 
比如: 
srand((UINT)GetCurrentTime()); 
int x = rand() % 100; 
是生成 0 到 100 之间的随机数。

srand()是用来初始化随机种子数的,因为rand的内部实现是用线性同余法做的,他不是真

的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,式子如下

: 
rand = rand*const_1 + c_var; 
srand函数就是给它的第一个rand值。

用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的, 
比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))   产生一个0到n之间的随机


RAND_MAX=0x7fffffff

5.总结 
1)srand()给rand()提供种子 
2)srand()中的seed一般由时间函数得,eg srand((UINT)GetCurrentTime()) srand( (u

nsigned)time( NULL ) ) time()函数得到现在的系统时间...等等

srand()以及rand()函数用法的更多相关文章

  1. Matlab中Rand()函数用法

    一.理论准备 matlab函数randn:产生均值为0,方差 σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数. 用法:Y = randn(n),返回一个n*n的随机项的矩阵.如果n不是 ...

  2. c语言中的rand()函数用法

    rand() rand()函数作用:用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()函数返回:返回一个范围在 ...

  3. 实验吧-杂项-你没有见过的加密!(php srand()和rand()函数)

    什么垃圾东西,弄半天,Windows上运行乱码,linux上7.3的php运行也是乱码(气死). 下载文件,查看内容 <?php function encrypt($str) { $crypte ...

  4. srand()、rand()、time()函数的用法

    srand()就是给rand()提供种子seed. 如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的. 以一个固定的数值作为种子是一个缺点.通常的做法是 :以这样一句srand ...

  5. RAND函数和SRAND函数

    首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include<stdlib.h&g ...

  6. rand()函数的用法

    C++中rand() 函数的用法 1.rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数. 2.如果你要产生0~99这100个整数中的一个随机整数, ...

  7. srand()和rand()函数的使用

    rand()函数不接受参数,默认以1为种子(即起始值). 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义.(但这样便于程序调试) srand()函数就是指明种子的大小:只 ...

  8. 关于srand()rand()的用法

    转自:http://baike.baidu.com/link?url=bhos65ZKp8lEq_6chSsmQv29jHrqjN_IFGVMNod6BuicQ-3oCP5VsEn3RBjXBPvA7 ...

  9. Pytorch中randn和rand函数的用法

    Pytorch中randn和rand函数的用法 randn torch.randn(*sizes, out=None) → Tensor 返回一个包含了从标准正态分布中抽取的一组随机数的张量 size ...

随机推荐

  1. NSURLSession访问网络数据

    1.NSMutableURLRequest的设置 //创建NSMutableURLRequest对象 NSMutableURLRequest *request = [NSMutableURLReque ...

  2. C# 文件重命名

    记得C# File类中是没有rename这个方法 所以网上很多都用的是move moveTo copy+delete等这些方法 其实以上的方法 虽然可以实现功能 但看起来总觉得很蛋疼 今天百度 突然发 ...

  3. javascript中apply、call和bind的区别

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...

  4. UEditor上传图片等附件都出现红叉,该怎么解决

    ------解决方案-------------------------------------------------------- 引用: 在本地这样配置就没问题:var URL = window. ...

  5. Visual Studio 2015 Update 3 正式版下载

    vs2015-update3    .NET Core 1.0  文件名 cn_visual_studio_enterprise_2015_with_update_3_x86_x64_dvd_8923 ...

  6. Android: 解决ADB server didn't ACK

    分析: 1         打开命令行工具, 运行adb start-server 启动服务,报错ADB server didn't ACK, 并且根据错误信息可以得到服务绑定的端口是5037,极有可 ...

  7. iOS 收起键盘的几种方式

    iOS 收起键盘的几种方式 1.一般的view上收起键盘 // 手势 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ ...

  8. 161223、mysql锁的两个例子

    版本:mysql5.5.52 存储引擎:InnoDB 隔离级别:READ-COMMITTED 示例一: 事务1:左图      事务2:右图 1. 事务2中属于快照读,基于多版本的并发控制协议--MV ...

  9. 使用jquery-qrcode生成二维码

    一.使用jquery-qrcode生成二维码 先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcod ...

  10. AC6102 开发板千兆以太网UDP传输实验2

    AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...