Chinaunix首页 | 论坛 | 博客
  • 博客访问: 89027
  • 博文数量: 33
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-21 16:23
文章分类

全部博文(33)

文章存档

2016年(5)

2015年(29)

我的朋友

分类: C/C++

2015-12-31 10:07:11

Srand()和rand()

 

srand和配合使用产生伪序列。在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列

 

系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的

函数名: time
  头文件:
  函数原型:time_t time(time_t * timer)
  功能: 获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)

//测试程序

#include

#include

void func(void)

{

        int i;

//      srand(time(NULL));

//      printf("%ld",(long)(time(NULL)));

        for (i = 0; i < 10; i++)

        {

                printf("%d  ", rand() % 10);

        }

}

int main(void)

{

        int i;

        for (i = 0; i < 5; i++)

        {

                func();

//              sleep(1);

                printf("\n");

        }

        return 0;

}

 

之前不调用srand();

zhyi@ubuntu:~/test$ ./test

3  6  7  5  3  5  6  2  9  1 

2  7  0  9  3  6  0  6  2  6 

1  8  7  9  2  0  2  3  7  5 

9  2  2  8  9  7  3  6  1  2 

9  3  1  9  4  7  8  4  5  0 

zhyi@ubuntu:~/test$ ./test

3  6  7  5  3  5  6  2  9  1 

2  7  0  9  3  6  0  6  2  6 

1  8  7  9  2  0  2  3  7  5 

9  2  2  8  9  7  3  6  1  2 

9  3  1  9  4  7  8  4  5  0

 

每次程序运行结果都是一样的,因为系统默认将1作为伪随机数种子的初始值(_Randseed全局变量)

之前调用srand();

zhyi@ubuntu:~/test$ ./test

1451270785 :9  6  6  7  0  5  2  9  2  1 

1451270786 :6  1  4  9  0  6  0  1  1  1 

1451270787 :6  3  7  4  8  0  0  7  0  4 

1451270788 :5  3  2  3  4  8  6  8  3  3 

1451270789 :6  4  8  0  8  8  0  0  6  4 

zhyi@ubuntu:~/test$ ./test

1451270971 :8  6  8  8  1  8  1  1  8  8 

1451270972 :4  7  1  9  0  0  1  1  4  8 

1451270973 :6  5  2  1  6  9  4  5  5  6 

1451270974 :2  4  2  7  8  0  2  6  1  1 

1451270975 :4  9  2  7  6  7  3  9  1  1

因为系统每次调用之前利用获取系统的时间给随机数种子初始化不同的值

 

注意:如果不sleep(1),则程序运行时每次获取的系统时间是一样的;(因为程序运行时间时间<系统时间的改变(系统1ms更新time))

zhyi@ubuntu:~/test$ ./test

1451271203 :1  2  8  4  1  5  3  2  6  3 

1451271203 :1  2  8  4  1  5  3  2  6  3 

1451271203 :1  2  8  4  1  5  3  2  6  3 

1451271203 :1  2  8  4  1  5  3  2  6  3 

1451271203 :1  2  8  4  1  5  3  2  6  3

随机浮点数生产

#include

#include

#include

 

#define NUM  100000000 //产生数据量大小

#define RAND_MAX 1000000 //产生的数据大小范围

double rand_float()

{

       return  (double)( rand()/(double)RAND_MAX );

      

}

int main(int argc,char* argv[])

{

       int i;

       double f;

       FILE *fp;

       fp = fopen(argv[1],"w");

       srand(time(NULL));

       for(i=0;i<=NUM;i++)

       {

              f = rand_float();

              fprintf(fp,"%lf\t",f);

       }

       fclose(fp);

       return 0;

}



阅读(1149) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~