什么是随机数?
随机数在很多编程语言中都有应用,它们被用来进行模拟、加密、数据合成等等许多方面,在C语言中也不例外。一个随机数就是一个按照某个随机过程得到的数值。这里的随机过程可以是人造的,也可以是自然的,不过在计算机中,由于计算机的运算是是一系列确定的操作,因此计算机得到的所谓随机数,本质上都只是伪随机数,也就是一种看起来像随机数的数列。所以,我们通常通过随机函数来生成这些伪随机数,这样每次生成的数值都是不同的。
用rand()函数生成随机数
在C语言中,生成随机数的函数是rand(),它的头文件是stdlib.h。rand()函数生成的是0到RAND_MAX之间的整数,RAND_MAX是一个常量,它的值至少为32767,取决于不同的操作系统,还可能更大。这意味着rand()所生成的数是比较大的,如果我们需要生成1~100的随机数,就需要将rand()所生成的数值缩小到1~100范围内。
预处理指令:
#include
#include
#define RAND_RANGE 100
生成1~100的随机数的函数
int generateRandomNumber()
{
double base = (double)rand() / (double)RAND_MAX;
double result = (double)RAND_RANGE * base + 1;
return (int)result;
}
首先,我们在代码的开头定义了一个名为RAND_RANGE的宏,它表示随机数的生成范围,这里为100。然后,generateRandomNumber()函数首先调用rand()函数生成一个0到RAND_MAX之间的随机数,接着将该随机数缩小,并加上1,得到1~100范围内的随机整数,最后将它转换为int类型。这个函数的实现方式称为线性同余算法,是一种比较常见的伪随机数产生算法。
如何使每次生成的数都不同?
有时,我们需要生成一系列不同的随机数,比如需要随机地抽取一些数值作为某个实验的输入。在这种情况下,我们如果只调用一次上述函数,得到的结果可能都相同,因为每次程序运行时,rand()函数所得到的初始值都是相同的,也就是说,程序一开始得到的随机数序列是相同的。因此,需要使用srand()函数来根据当前的时间值或者其他不太可能重复的值来“重置”rand()函数所得到的随机数序列,从而在不同的时间获取的随机数序列也不同。
使用srand()函数生成不同的随机序列
void generateDifferentRandomNumbers(int arraySize)
{
int diffArray[arraySize];
srand((unsigned int)time(NULL));
for (int i = 0; i < arraySize; i++)
{
int newRandomNumber = generateRandomNumber();
for (int j = 0; j < i; j++)
{
if (diffArray[j] == newRandomNumber)
{
newRandomNumber = generateRandomNumber();
j = -1;
}
}
diffArray[i] = newRandomNumber;
printf("%d\n", diffArray[i]);
}
}
在上述示例中,我们首先通过srand()函数重置了rand()函数所得到的随机数序列,使用了当前的时间值作为它的参数,这样每次程序运行时,所得到的随机数序列都是不同的。然后,我们循环生成arraySize个不同的随机数,通过一个diffArray数组存储这些不同的随机数,这里我们保存了所有随机数到一个数组中,当然你也可以将这些随机数存储到文件中等等。在生成新的随机数时,我们通过一个内层循环与之前已经生成的随机数进行比较,如果相同,说明这个新的随机数也被之前的随机数生成,需要重新生成一个不同的随机数。
总结
本文介绍了在C语言中如何生成随机数的方法,并提供了一个具有重置序列功能的随机数生成函数。为了保证每次生成的随机数不同,我们需要使用srand()函数来重置rand()函数所得到的随机数序列,具体的做法是使用当前时间值作为srand()函数的参数。