Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 叮叮当当地警告rand()的随机性有限_C_Random_Warnings_Clang Tidy - Fatal编程技术网

C 叮叮当当地警告rand()的随机性有限

C 叮叮当当地警告rand()的随机性有限,c,random,warnings,clang-tidy,C,Random,Warnings,Clang Tidy,这一行代码让我觉得非常整洁:rand()的随机性有限。为什么会出现这个警告?如何修复它?尽管rand()对于很多应用程序(尤其是Park Miller和Bays Durham shuffling等扩展程序)都是足够的,但一些代码检查工具将其等同于魔鬼的缩小版本 ClangTidy警告您,它可能没有足够的随机特性来满足您的需求 是否可以给我发送一个代码片段,其中Clang Tidy在使用rand()时不会警告我 如果您坚持使用rand(),则必须禁用警告: toZero = rand() % N;

这一行代码让我觉得非常整洁:rand()的随机性有限。为什么会出现这个警告?如何修复它?

尽管
rand()
对于很多应用程序(尤其是Park Miller和Bays Durham shuffling等扩展程序)都是足够的,但一些代码检查工具将其等同于魔鬼的缩小版本

ClangTidy警告您,它可能没有足够的随机特性来满足您的需求


是否可以给我发送一个代码片段,其中Clang Tidy在使用
rand()
时不会警告我

如果您坚持使用
rand()
,则必须禁用警告:

toZero = rand() % N;
更好的选择是使用库和函数

一个例子:

toZero = rand() % N; // NOLINT(cert-msc30-c, cert-msc50-cpp)
#包括
#包括
#包括
//返回种子随机数生成器的函数。
内联标准::mt19937和生成器(){
//由于生成器是静态的,因此它只会被播种一次(每个线程)
静态线程_local std::mt19937 gen(std::random_device{}());
返回发电机;
}
//生成[min,max]范围内整数的函数
模板
T我的随机数(T最小值,T最大值){
标准:均匀分布距离(最小值、最大值);
返回距离(生成器());
}
//用于在[min,max]范围内生成浮动的函数
模板
T我的随机数(T最小值,T最大值){
标准:均匀实分布距离(最小值、最大值);
返回距离(生成器());
}
int main(){
无符号N=100;
STD::CUT< P>函数<代码> RAND()/Cux>不是C++函数,而是C函数。它来自STDLIB .h,并在ISO/IEC 9899(C语言)中定义。
它不能保证高随机性的便携水平。
标准中可能有许多不同的实现,并且没有适当的质量控制。
rand()的一个典型实现是:

也就是说,在大多数情况下,
rand()
是一个PRNG,除了next的初始值之外,根本不使用任何熵

因此,您应该使用C++11随机库。它的工作原理如下:

static int next = (int) time();
int rand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
#包括
std::默认随机引擎生成器;
标准:均匀分布(1,6);
自动骰子=标准::绑定(分发、生成器);
int roll=骰子();
演示:

注意事项:
uniform_int_distribution
生成一个分布函数,该函数将从基础生成器检索在给定范围内均匀分布的数字。这一点很重要:模不是均匀分布函数。仅执行类似
int roll=1+nextInt()%6的操作是不均匀分布的。(感谢Christian Hujer)

确实有帮助吗?还有..这是否回答了您的问题?您的代码是否调用了
srand()
一次,通常是在
main()
函数的早期?是否可以向我发送一个代码片段,其中Clang Tidy在使用rand()时不会警告我?
static int next = (int) time();
int rand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
#include <random>
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(1, 6);
auto dice = std::bind(distribution, generator);
int roll = dice();