C语言中如何使用随机数
随机数的使用,是不少在学C语言过程中进行一些小功能开发的同学的一个技术问题,今天我们就为大家讲解如何在C语言中使用随机数。
通常情况下,使用最多的方法的就是使用rand函数随机生成伪随机数来完成随机数的生成工作。注意这里的伪随机数并非是假的! 只不过是计算机按自己的一套理论生成,并不是”完全理想”状态下的随机数,所以是可以接受的。
函数原型为:int rand(void); 需要包含stdlib头文件,它可以生成一个0 ~RAND_MAX之间的数字,其中RAND_MAX是一个宏,VC6下笔者查看为0x7fff,建议大家亲自上机实验!
这个时候你可能会遇到下面几个问题:
Q1:为什么每次生成的数字都一样?
A1:rand函数每次生成的数字与所谓的”种子”有关,使用rand函数前需要使用srand函数进行种种子(请见后文)。如果没有调用,系统会默认给1,导致每次的随机数都一样。
Q2:为什么最大是0x7fff?
A2:这可能取决于编译器环境,笔者这里是VC6,在rand的函数中看到定义的最大值为0x7fff,如下图:
Q3:如果我想生成特定范围内的数字,该如何写呢?
A3:多多利用%求余运算符即可。如:
生成10以内的数字,可以参考rand()%10
生成1~10之间的数字,可以参考rand()%10+1
特定的,要生成a~b之间的数字,可以参考rand()%(b-a+1)+a
而更多时候,我们希望每次运行生成的数字都不相同,这个时候需要配合srand函数来解决这一问题。关于具体原因,大家可以参考rand函数与srand函数的实现细节来加以理解,代码如下:
/***
*rand.c - random number generator
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines rand(), srand() - random number generator
*
*******************************************************************************/
#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>
/***
*void srand(seed) - seed the random number generator
*
*Purpose:
* Seeds the random number generator with the int given. Adapted from the
* BASIC random number generator.
*
*Entry:
* unsigned seed - seed to seed rand # generator with
*
*Exit:
* None.
*
*Exceptions:
*
*******************************************************************************/
void __cdecl srand (
unsigned int seed
)
{
_getptd()->_holdrand = (unsigned long)seed;
}
/***
*int rand() - returns a random number
*
*Purpose:
* returns a pseudo-random number 0 through 32767.
*
*Entry:
* None.
*
*Exit:
* Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/
int __cdecl rand (
void
)
{
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
}
那么srand函数如何使用呢,先看函数原型:
void srand(unsigned seed); 只需要在rand函数使用之前,调用srand函数传入一个种子即可。但事实上传入一个数,往往产生的随时仍然固定不变。 那么较为聪明的写法目前看来只有使用系统时间作为种子最为合适,所以这里srand的参数往往传入time(NULL)参数作为获取系统当前时间作为种子,来产生不同的结果!
并注意类型一致,srand((unsigned)time(NULL)); 记得添加time.h的头文件!
测试代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int r=0;
int i=0;
srand((unsigned)time(NULL));
while(i++<10)
{
printf("r = %d\n",rand());
}
return 0;
}
大家可以自行上机测试,如发现新的问题或有其他好玩的,欢迎告知我们!