在编程中,我们经常需要生成随机数,这些随机数可以用于模拟实验、游戏、密码生成等场景,在C语言中,我们可以使用标准库中的rand()函数来生成随机数,本文将介绍如何在C语言中使用rand()函数生成随机数,并讨论如何通过调整种子值来控制随机数的生成范围和分布。

1、rand()函数简介

rand()函数是C语言标准库中的一个函数,用于生成一个0到RAND_MAX之间的整数,RAND_MAX是一个常量,其值通常为32767或65535,要使用rand()函数,我们需要包含头文件<stdlib.h>。

2、生成随机数

要生成一个随机数,我们只需调用rand()函数即可,要生成一个0到99之间的随机数,我们可以这样做:

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

int main() {
    srand(time(NULL)); // 设置种子值
    int random_number = rand() % 100; // 生成0到99之间的随机数
    printf("随机数: %d
", random_number);
    return 0;
}

在上面的代码中,我们首先包含了<stdlib.h>头文件以使用rand()函数,然后包含了<time.h>头文件以获取当前时间作为种子值,接下来,我们调用srand()函数设置种子值,参数为当前时间,我们调用rand()函数生成一个随机数,并通过取模运算将其限制在0到99之间。

3、控制随机数范围和分布

默认情况下,rand()函数生成的随机数范围为0到RAND_MAX,有时我们需要生成更大范围或具有特定分布的随机数,为了实现这一点,我们可以通过对rand()函数的结果进行适当的数学运算来调整随机数的范围和分布,以下是一些常见的方法:

- 生成指定范围内的随机数:通过将rand()函数的结果与所需范围的最大值相减,然后除以所需范围的大小,可以得到一个位于[0, 1)范围内的浮点数,将这个浮点数乘以所需范围的大小并加上所需范围的最小值,就可以得到一个位于所需范围内的随机数,要生成一个1到100之间的随机数,我们可以这样做:

int random_number = (rand() % RAND_MAX / (RAND_MAX / 100)) + 1;

C语言实现随机数生成

- 生成均匀分布的随机数:要生成一个具有均匀分布的随机数,我们可以使用线性同余法(LCG),线性同余法是一种简单而高效的伪随机数生成算法,以下是一个使用线性同余法生成均匀分布的随机数的示例:

#define A 48271 /* 乘法常数 */
#define M 2147483647 /* 模数 */
#define Q (M / A) /* 商 */
#define R (M % A) /* 余数 */

int random_number;
double fraction, remainder;

/* 初始化线性同余法 */
void init_lcg(int seed) {
    long long a = seed;
    for (int i = 1; i < Q; i++) {
        a = (a * A + R) % M;
    }
    random_number = a;
}

/* 生成下一个随机数 */
int next_random_number() {
    fraction = (double)(random_number / Q);
    remainder = random_number % Q;
    random_number = (A * (remainder - R * fraction) + R) % M;
    return random_number;
}

在上面的代码中,我们定义了四个宏:A、M、Q和R,它们分别表示乘法常数、模数、商和余数,我们还定义了一个名为init_lcg的函数来初始化线性同余法,以及一个名为next_random_number的函数来生成下一个随机数,要使用这些函数,我们首先调用init_lcg函数设置种子值,然后多次调用next_random_number函数来生成所需的随机数。