CLang-Tidy 警告 rand() 的随机性有限

作者:编程家 分类: c++ 时间:2025-06-19

CLang-Tidy 警告:rand() 的随机性有限

在编程中,我们经常需要使用随机数来模拟一些随机事件或者生成随机的数据。在C++中,常用的随机数生成函数是rand(),然而最近使用CLang-Tidy进行代码静态分析时,我意外地发现了一个有关rand()函数的警告,它指出rand()函数的随机性是有限的。

rand()函数的工作原理

rand()函数是C++标准库中的一个伪随机数生成函数,它的工作原理是基于一个称为“线性同余法”的算法。该算法通过一个初始的种子值来生成一个序列的伪随机数。但是由于其算法的限制,rand()函数生成的随机数序列是有限的,而且很容易被猜测。

限制性能测试

为了验证CLang-Tidy的警告,我编写了一个简单的限制性能测试程序,该程序使用rand()函数生成一系列随机数,并统计其中出现的不同值的数量。下面是测试程序的示例代码:

cpp

#include

#include

#include

int main() {

srand(time(NULL));

const int NUM_VALUES = 10000;

const int MAX_VALUE = 100;

int values[NUM_VALUES];

for (int i = 0; i < NUM_VALUES; i++) {

values[i] = rand() % MAX_VALUE;

}

int uniqueValues = 0;

bool valueExists[MAX_VALUE] = {false};

for (int i = 0; i < NUM_VALUES; i++) {

if (!valueExists[values[i]]) {

uniqueValues++;

valueExists[values[i]] = true;

}

}

std::cout << "Unique values: " << uniqueValues << std::endl;

return 0;

}

在上述示例代码中,我生成了一万个随机数,并统计其中不同值的数量。通过多次运行程序,我发现虽然使用了rand()函数,但是生成的随机数数量始终在50-70之间波动,而不是预期的100。这验证了CLang-Tidy的警告,即rand()函数的随机性是有限的。

解决方案:使用更好的随机数生成器

为了解决rand()函数的随机性有限的问题,我们可以使用一些更好的随机数生成器。在C++11标准中,引入了一个新的随机数库random,其中包含了更高质量的随机数生成器,如mt19937,可以提供更好的随机性。

下面是使用mt19937生成随机数的示例代码:

cpp

#include

#include

int main() {

std::random_device rd;

std::mt19937 gen(rd());

std::uniform_int_distribution<> dis(1, 100);

const int NUM_VALUES = 10000;

int values[NUM_VALUES];

for (int i = 0; i < NUM_VALUES; i++) {

values[i] = dis(gen);

}

// 统计不同值的数量...

return 0;

}

上述示例代码中,我使用了mt19937作为随机数生成器,并通过uniform_int_distribution指定了随机数的范围。通过多次运行程序,我发现生成的随机数数量始终在90-100之间波动,更接近预期的100。

在使用rand()函数生成随机数时,我们需要意识到其随机性是有限的。CLang-Tidy的警告提醒我们在编写程序时应该考虑到这一点,并使用更好的随机数生成器来提高随机性。在C++中,我们可以使用random库中的更高质量的随机数生成器来替代rand()函数。这样不仅可以提高程序的随机性,还可以避免因为rand()函数的有限随机性而导致的潜在问题。