C 叮叮当当地警告rand()的随机性有限
这一行代码让我觉得非常整洁: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()
对于很多应用程序(尤其是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();