C 语言 rand() 和 srand() 使用方法

前言

有时我们想用 rand 生成一组随机数,即使我们调用了 srand,但生成的还是相同值。为什么会产生这种情况?又该如何解决?下面将用第一视角一起探究这其中的奥秘。
C 语言 rand() 和 srand() 使用方法_第1张图片

问题出现

场景描述:

想生成一组整形随机数,放入数组中,用来测试自己的排序是否正确。

于是我写出了下方代码,生成随机数。

先简单了解下用到的函数:

// 返回 time_t 类型的当前时间的时间戳
time_t time(time_t* timer);

// 传入一个种子,为伪随机数生成器初始化
void srand(unsigned int seed);

// 得到一个整形伪随机数
// 随机数的范围:0~32767
int rand(void);
#include 
#include 
#include 

int main() {
    int arr[10] = { 0 };
    
    for (int i = 0; i < 10; ++i) {
        srand((unsigned int)time(NULL));
        // 两个相减是为了出现负的随机数,使测试范围更广
        arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1);
        printf("%d ", arr[i]);
    }
    return 0;
}

我发现尽管我调用了 srand 函数,可生成的数组值还是同一个。

我思考后想到,因为 for 循环执行速度太快,整个程序都是在一秒内完成的。

所以出现了都是同一个值的情况。

初步解决

于是我想出了下面的解决方法:

我可以在 for 循环内调用 Sleep 函数,让我的电脑休眠一下,这样就不会出现上述情况了。

于是我写出了下方的代码:

#include 
#include 
#include 
#include 

int main() {
    int arr[10] = { 0 };

    for (int i = 0; i < 10; ++i) {
        Sleep(1000);
        srand((unsigned int)time(NULL));
        arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1);
        printf("%d ", arr[i]);
    }
    return 0;
}

通过休眠后,就成功解决问题了。

可是,如果睡眠时间太短,那么还是会出现重复的现象如果睡眠时间太长,程序运行速度就太慢。

最终方法

因为上述的原因,我继续查询资料,了解了 randsrand 的基本原理,最终成功解决了该问题。

srand 函数传入一个数值后,srand 会根据这个生成一个随机序列表(通常有 4,294,967,296 个数),传入相同的数生成的序列表是相同的。然后 rand 从序列的头部取出一个数返回,并将这个数放在随机序列表尾部,因此如果你要取的数据量非常大,是会出现与之前取出的数重复的情况。

此时,上面出现的问题也很好解决了。因为计算机运行速度很快,所以我们每次进入循环都会生成一个相同的随机序列表,rand 函数只会取出其第一个数。

要解决这个问题,我们只需要在循环前调用一次 srand 函数就好了,这样就不会重复生成序列表了。

下方是最终的代码:

#include 
#include 
#include 

int main() {
    int arr[10] = { 0 };
    srand((unsigned int)time(NULL));
    
    for (int i = 0; i < 10; ++i) {
        arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1);
        printf("%d ", arr[i]);
    }
    return 0;
}

你可能感兴趣的:(C语言,c语言,c++)