rand(),srand()区别

先从随机数的原理谈起.

计算机的随机数都是由伪随机数,即是由小M多项式序列生成.产生每个小序列都有一个初始值,即随机种子.

srand()产生随机种子.

rand()产生随机数

要保证计算机产生不相同的随机数,应保证它们的随机种子是不一样的.

srand( (unsigned)time( NULL ) );

就是以时间做为随机种子,因为每次你运行的时间总是不一样的.

补充一点是小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,即你取得65535个随机数后它们又重复出现了.

使用时要加头文件:

#include<string.h>

int nRand;

srand( (unsigned)time( NULL ) );

for(int i=0;i<65538;i++)

{

nRand=rand();

if(i==1||i==65536)

printf("%d\r\n",nRand);

}

1,先看一个例子
#include <iostream>

#include<stdlib.h>
#include<time.h>
using namespace std;
int main( void )
{
    int i;

    srand( (unsigned)time( NULL ) );

    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

#include<iostream>
#include<stdlib.h>
#include<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的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进rand函数的实现中,我觉得至少有三个原因:
    (1)可以高效产生连续的随机数,不用每次都初始化;
    (2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据做种子,而不是系统时钟;
    (3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不了程序每次运行都产生同样的一系列随机数而已——有些情况下,这是无所谓的。 

    事实上有一个更重要的原因:
    作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-:产生的序列必须是可重现的。
    这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中使用了和rand()的结果相关的数据,通过一个可控的可重现序列,我们就有机会再现每一次测试的过程,从而更有效的找到问题的所在。
    所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么,必须保证你的rand()调用是可重现的。

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之间的随机数

5.总结
1)srand()给rand()提供种子
2)srand()中的seed一般由时间函数得,eg  srand((UINT)GetCurrentTime())  srand( (unsigned)time( NULL ) ) time()函数得到现在的系统时间...等等

rand(),srand()区别

时间: 2024-10-25 21:36:53

rand(),srand()区别的相关文章

C++随机数rand(), srand()

c++产生随机数会用到rand(), srand()函数,下面总结两个函数特性和使用. 1. rand() #include <iostream> #include <cstdlib> using namespace std; int main() { int m; for(int i = 1; i <= 5; i++) { m = rand(); cout << "m = " << m << endl; } retur

数据结构及算法篇bsearch crypt lfind lsearch qsort rand srand

crypt(将密码或数据编码) 相关函数 getpass 表头文件 #define _XOPEN_SOURCE #include<unistd.h> 定义函数 char * crypt (const char *key,const char * salt); 函数说明 crypt()将使用Data Encryption Standard(DES)演算法将参数key所指的字符串加以编码,key字符串长度仅取前8个字符,超过此长度的字符没有意义.参数salt为两个字 符组成的字符串,由a-z.A-

rand srand

题外:先定义一个指针变量int *a; 再将整数b的地址赋给指针变量 a=&b ;    谨记指针变量a只是地址 *a相当于整数 之后*a 就可以表示 指向b了 也可以在定义的时候初始化 int *a=&b; int q=2; _p=&q; 此时*_p 和q 都为2*_p=1;因为*_p是指向存储q的地址的  所以*_p的值发生改变q也改变 rand()产生一个0~32767之间的伪随机数.而srand(unsigned t)是为rand()产生伪随机数下一个"种子&qu

C/C++中产生随机数(rand,srand用法)

计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了.) 我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,

[转]C++/C中产生随机数(rand,srand用法)

参考原文地址:https://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html 计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生的每个小序列都有一个初始值,即随机种子(即根据某一个初始值代入某个公式产生一系列值),注意:小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后,它们又会重复出现. 我们知道rand()函数可以用来产生随机数,但这不是真正意义上

numpy.random.randn()与rand()的区别

numpy中有一些常用的用来产生随机数的函数,randn()和rand()就属于这其中. numpy.random.randn(d0, d1, -, dn)是从标准正态分布中返回一个或多个样本值. numpy.random.rand(d0, d1, -, dn)的随机样本位于[0, 1)中. 代码: import numpy as np arr1 = np.random.randn(2,4) print(arr1) print('*********************************

php函数mt_rand和rand 速度测试

今天在写代码时,看到以前的同时写了一个取随机数,用到了mt_rand(2,19) 就顺手搜了一下,mt_rand和rand的区别. 先看官方的解释 mt_rand 和 rand mt_rand — 生成更好的随机数 rand — 产生一个随机整数 其实两个函数的功能是没有区别的,都是生成一个随机数字. 从网上拷贝了一个例子,看看两个函数的运行时间.. <?php function microtime_float() { list($usec, $sec) = explode(" "

探秘rand神秘面纱

这位名字很长同学的帖子rand产生出的一个随机函数是递增的里看到对rand.种子值不解,以及老师说"因为相邻两轮循环的时间小于1秒,所以种子值就是相同的,于是随机数就是相同的",勾起了我对rand的兴趣.恰好前几天看the c programming language看到一些实现: unsigned long int next = 1; //rand函数,返回值在0~32767之间的伪随机数. int rand(void){ next = next * 1103515245 + 123

用MySQL里的Rand()生成 不连续重复 的随机数年龄以及随机姓名字符串

前言:        RAND函数,返回在范围0到1.0内的随机浮点值.如果一个整数参数N被指定,它被用作种子值. 一,朋友问题描述如下:(1),有一个用户表,有id,用户的真实名字,年龄.通过一段存储过程来实现向表里插入100数据,其中年龄随机姓名 姓氏:'赵钱孙李周吴郑王';,随机取出一个名字:'一段文字字符串',随机的取出一个字或者两个字要求:随机的名字不能出现连续重复. (2),然后我写出的代码如下:-- 创建用户表,在project里create table user1 (id int