c++中rand()和srand()函数产生随机数的使用

 

       计算机产生随机数的本质介绍:rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a).

        rand()会返回一随机数值,范围在0至RAND_MAX 间。返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767),运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。 在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。

        计算机对此随机数的编译原理:

1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;

2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)

3) 根据需要多次调用rand(),从而不间断地得到新的随机数;

4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。         

                                                                                                                                                                                                                回顾一下c语言产生随机数的函数(random()),但这些函数在VC上编译都是不能通过的:                                                 

random()产生随机数为0或1;

random(n)产生随机数为0到n之间的一个随机数;

rand()产生0到32768之间的一个随机数。

                              

需要首先使用随机数“种子”初始化,srand函数。

1.下面是0~32767之间的随机数程序

#include <stdlib.h>
#include <stdio.h>
#include <time.h> //使用当前时钟做种子

int main()
{
   int i;
   srand( (unsigned)time( NULL ) );//初始化随机数
   /* 打印10个随机数. */
   for( i = 0; i < 10;i++ )
   printf( " %d\n", rand() );//产生0~32767的随机数
   return 0;
}

2.产生介于1 到10 间的随机数值,此范例未设随机数种子

#include <stdlib.h>
#include <stdio.h>
#include <time.h> 
int main( )
{   int i;
    srand( (unsigned)time( NULL ) );  
       for( i = 0; i < 10;i++ )
            printf( "%5.2f\n", rand()/32767.0);
    return 0;
}

3.而产生1~100之间的随机数可以这样写:

#include <stdlib.h>
#include <stdio.h>
#include <time.h> 
int main( )
{   int i;
    srand( (unsigned)time( NULL ) );  
    for( i = 0; i < 10;i++ )
         printf( "%d\n", rand()%100+1);
    return 0;
}

4.产生0--99之间的随机数:

#include <stdlib.h> 
#include <stdio.h> 
int main() 
{ 
   int i; 
   for(i=0; i<10; i++) 
      printf("%d\n", rand() % 100); 
   return 0; 
}

5.产生范围内的随机数:(产生在区间【x,y】的随机数)

    由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数,那么如何产生从X~Y的数呢?

    从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:

    k=rand()%(Y-X+1)+X;

    这样,就可以产生你想要的任何范围内的随机数了。

    由于我的IDE问题,当时一直显示不行,后来直接在学长帮助下直接输出了(unsigned)time( NULL )然后就是可以用的。

#include <stdlib.h>
#include <stdio.h>
#include <time.h> 
int main( )
{   
	int i;
	int K;
	int X=1;
	int Y=1000;
    srand( (unsigned)time( NULL ) );  
    for( i = 0; i < 5;i++ )
    {
			K=rand()%(Y-X+1)+X;
         printf( "%d\n", K);
     }
	printf("%d\n",(unsigned)time( NULL )) ;//之前一直不行,后来直接拿这句话来测试,还是通用的 
    return 0;
}

6.j=(int)(n*rand()/RAND_MAX+1),用来产生0到N之间的整数这种方法也挺好的,其中RAND_MAX已经在头文件里面了,定义好了的。

 

本文先介绍应用篇,接下来有时间的话整理一下源码供大家分享。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值