toZero = rand() % N;这行代码告诉我Clang-Tidy: rand()具有有限的随机性。为什么会出现这个警告?我怎么才能修复它?
发布于 2019-12-13 21:27:29
尽管rand()对很多应用程序来说已经足够了(特别是像Park-Miller和Bays-Durham shuffling这样的扩展),但一些代码检查工具将其等同于缩小版的魔鬼。
Clang-Tidy警告您,它可能没有足够的随机性属性来满足您的需求。
发布于 2020-02-14 15:32:19
在使用rand()时Clang-Tidy不会警告我的地方,可以给我发一个代码片段吗?
?
如果您坚持使用rand(),则必须禁用该警告:
toZero = rand() % N; // NOLINT(cert-msc30-c, cert-msc50-cpp)更好的选择是使用库和函数。
举个例子:
#include <iostream>
#include <random>
#include <type_traits>
// A function to return a seeded random number generator.
inline std::mt19937& generator() {
// the generator will only be seeded once (per thread) since it's static
static thread_local std::mt19937 gen(std::random_device{}());
return gen;
}
// A function to generate integers in the range [min, max]
template<typename T, std::enable_if_t<std::is_integral_v<T>>* = nullptr>
T my_rand(T min, T max) {
std::uniform_int_distribution<T> dist(min, max);
return dist(generator());
}
// A function to generate floats in the range [min, max)
template<typename T, std::enable_if_t<std::is_floating_point_v<T>>* = nullptr>
T my_rand(T min, T max) {
std::uniform_real_distribution<T> dist(min, max);
return dist(generator());
}
int main() {
unsigned N = 100;
std::cout << my_rand(0U, N - 1) << '\n'; // unsigned int:s instead of rand() % N
std::cout << my_rand(-5., 5.) << '\n'; // double's
}发布于 2021-05-29 23:32:39
函数rand()不是C++函数,而是C函数。它来自stdlib.h,并在ISO/IEC9899(C编程语言)中定义。它不能保证高随机性的便携水平。标准中可能有许多不同的实现,但没有适当的质量控制。rand()的典型实现是:
static int next = (int) time();
int rand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}也就是说,在大多数情况下,rand()是一个PRNG,并且根本不使用任何熵,可能除了的初始值之外。
所以你应该使用的是C++11随机库。下面是它的工作原理:
#include <random>
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(1, 6);
auto dice = std::bind(distribution, generator);
int roll = dice();演示:https://pastebin.run/pzhw6s36g9mf
注释: uniform_int_distribution<int>生成一个分布函数,该函数将从底层生成器中检索在给定范围内均匀分布的数字。这一点很重要: Modulo不是均匀分布函数。仅仅做像int roll = 1 + nextInt() % 6这样的事情并不是均匀分布的。(感谢Christian Hujer)
https://stackoverflow.com/questions/59323393
复制相似问题