srand()

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


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)(*rand()/(RAND_MAX+1.0))   产生一个0到n之间的随机


5.总结
1)srand()
rand()提供种子

2)srand()
中的seed一般由时间函数得
,eg srand((UINT)GetCurrentTime()) srand( (u

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    首先我们要对randsrand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明。

rand(产生随机数)
表头文件: #include<stdlib.h>

 

定义函数 :int rand(void)

 

函数说明 :

因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()

 

返回值:

返回0RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。

0~RAND_MAX每个数字被选中的机率是相同的。

 

范例:
/*
产生介于1 10 间的随机数值,此范例未设随机数种子,完整的随机数产生请参考
srand
()*/
#include<stdlib.h>
main()
{
int i,j;
for(i=0;i<10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
}

   执行:

9 4 8 8 10 2 4 8 3 6

9 4 8 8 10 2 4 8 3 6 //再次执行仍然产生相同的随机数

 

 

srand(设置随机数种子)

表头文件:#include<stdlib.h>

 

定义函数:void srand (unsigned int seed);

 

函数说明:
srand()
用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用geypid()time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

 

范例
/*
产生介于1 10 间的随机数值,此范例与执行结果可与rand()参照*/
#include<time.h>
#include<stdlib.h>
main()
{
int i,j;
srand((int)time(0));
for(i=0;i<10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf(" %d ",j);
}
}

     执行:与rand范例比较

5 8 8 8 10 2 10 8 9 9

2 9 7 4 10 3 2 10 8 7 

又或:

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

int main(void)
{
   int i;
   time_t t;

   srand((unsigned) time(&t));
   printf("Ten random numbers from 0 to 99/n/n");
   for(i=0; i<10; i++)
       printf("%d/n", rand() % 100);
   return 0;
}
除以上所说的之外,补充一点就是srand这个函数一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的数字。

MSDN中的例子。
// crt_rand.c
// This program seeds the random-number generator
// with the time, then displays 10 random integers.
//

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

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() );

  printf("/n");

  // Usually, you will want to generate a number in a specific range,
  // such as 0 to 100, like this:
  {
     int RANGE_MIN = 0;
     int RANGE_MAX = 100;
     for (i = 0;    i < 10; i++ )
      {
         int rand100 = (((double) rand() / 
                        (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
         printf( "  %6d/n", rand100);
      }
  }

总结:

我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种了,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a) 功能是
初始化随机产生器既rand()函数的初始值,即使把种子的值改成a; 从这你可以看到通过sand()函数,我们是可以产生可以预见的随机序列,
那我们如何才能产生不可预见的随机序列呢?我们可能常常需要这样的随机序列,是吧。利用srand((unsign)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的,对了,你知道time() 函数的功能是返回从1970/01/01到现在的秒数的吧,可能这个起始时间不正确,你查一下对不对吧,C还提供了另一个更方便的函数,randomize()
原形是void randomize(),功能是用来始初rand() 的种子的初始值,而且该值是不确定的,它相当于srand((unsign)(time(NULL)) 不过应注意的是randomize()的功能要通过time来实现所以在调用它时头文件要包含time.h罢了

 

随机函数:<<The C++ Programming Language>>(随机数生成的基本方法)

int randx = 0;

int rand()

{

    randx = randx * 1103515245 + 12345;

    return randx;

}

void srand(int a)

{

    randx = a;

}





Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1720410

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

请高手指点一下小弟,这两个函数该怎么用,我在msdn上没有找到详细的用法
谢谢大家了,最好能举例说明一下

 

 

 回复内容

postren:
srand
初始化随机种子

rand
产生随机数

postren:
#include <iostream>
#include <iomanip>
#include <ctime>

using namespace std;

void main()
{
srand((unsigned)time( NULL ));
for (int i = 0; i < 100; ++i)
{
cout << setw(5) << rand() << " ";
if ((i + 1) % 5 == 0)
{
cout << "/n";
}
}
}

liuguangzhou:
要善于使用MSDN
MSDN
中的例子。
// crt_rand.c
// This program seeds the random-number generator
// with the time, then displays 10 random integers.
//

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

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() );

  printf("/n");

  // Usually, you will want to generate a number in a specific range,
  // such as 0 to 100, like this:
  {
     int RANGE_MIN = 0;
     int RANGE_MAX = 100;
     for (i = 0;    i < 10; i++ )
      {
         int rand100 = (((double) rand() / 
                         (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
         printf( "  %6d/n", rand100);
      }
  }
}

fiftymetre:
rand
(产生随机数) 
相关函数 
srand 

表头文件 
#include<stdlib.h> 

定义函数 
int rand(void) 

函数说明 
rand()
会返回一随机数值,范围在0RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand() 

返回值 
返回0RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,其值为2147483647 

范例 
/* 
产生介于10 间的随机数值,此范例未设随机数种子,完整的随机数产生请参考 
srand
()*/ 
#include<stdlib.h> 
main() 

int i,j; 
for(i=0;i<10;i++) 

j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); 
printf("%d ",j); 



执行 
9 4 8 8 10 2 4 8 3 6 
9 4 8 8 10 2 4 8 3 6 





srand
(设置随机数种子) 
相关函数 
rand 

表头文件 
#include<stdlib.h> 

定义函数 
void srand (unsigned int seed); 

函数说明 
srand()
用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用geypid()time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。 

返回值 

范例 
/* 
产生介于10 间的随机数值,此范例与执行结果可与rand()参照*/ 
#include<time.h> 
#include<stdlib.h> 
main() 

int i,j; 
srand((int)time(0)); 
for(i=0;i<10;i++) 

j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); 
printf(" %d ",j); 



执行 
5 8 8 8 10 2 10 8 9 9 
2 9 7 4 10 3 2 10 8 7




du51:
rand()
产生的是假随机数字..
每次相同.

若要不同,以不同的值来初始化它.

初始化的函数就是srand()

为什么有time(0)
说白了是取当前时间.

所以,每次不同.
产生的数列就更近于随机数


实际上,用计算机不可能产生真正的随机数.

真正的随机数就是有人用手抛硬币........

jixingzhong:
void   srand(unsigned seed)            
初始化随机数发生器
int     rand()                         
产生一个随机数并返回这个数

jixingzhong:
函数名: rand 
  随机数发生器 
  : void rand(void); 
程序例

#include <stdlib.h> 
#include <stdio.h> 

int main(void) 

   int i; 

   printf("Ten random numbers from 0 to 99/n/n"); 
   for(i=0; i<10; i++) 
      printf("%d/n", rand() % 100); 
   return 0; 
}


函数名: srand 
  初始化随机数发生器 
  : void srand(unsigned seed); 
程序例

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

int main(void) 

   int i; 
   time_t t; 

   srand((unsigned) time(&t)); 
   printf("Ten random numbers from 0 to 99/n/n"); 
   for(i=0; i<10; i++) 
       printf("%d/n", rand() % 100); 
   return 0; 
}


dch4890164:
除以上所说的之外。
补充一点就是
srand
这个函数一定要放在循环外面或者是循环调用的外面。
否则的话得到的是相同的数字

fiftymetre:
真正的随机数就是有人用手抛硬币........


嘿嘿这个也不是随机的哟,世界上就没有随机的东东的哟。。。。。。

iamdavid0123:
rand()
每次返回的随机值都是一样的
srand()
对应于不同的种子seed,返回的随机值是不一样的

beginnow:
srand(GetTickCount());
rand();

GaoXX:
顶一下

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值