首页 > 解决方案 > 我可以在现代 C++ 中的随机数范围内排除一个数字或数字子范围吗?

问题描述

我有:

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> probability(0, 100);

我想排除这个概率范围内的一些数字。
示例 1:假设我想生成一个 0 到 100 之间的随机数,但这个数字永远不能是 4。
示例 2:假设我想生成一个 0 到 100 之间的随机数,但这个数字永远不能是4 到 7 之间的任何数字。

我想知道是否可以在不使用现代 C++ 的情况下实现std::rand

标签: c++c++11randomc++17

解决方案


如果你想留下来,uniform_int_distribution你可以像这样手动进行:

示例 1:假设我想生成一个介于 0 到 100 之间的随机数,但这个数字永远不能是 4。

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> distribution(0,99);
auto temp = distribution(mt);
auto random_number = (temp < 4) ? temp : temp + 1;

示例 2:假设我想生成一个介于 0 到 100 之间的随机数,但这个数字永远不能是 4 到 7 之间的任何数字。

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> distribution(0,96);
auto temp = distribution(mt);
auto random_number = (temp < 4) ? temp : temp + 4;

这可以概括为编写一个 function random_int_between_excluding(int first, int last, std::vector<int> exclude),尽管在某些时候遵循 NathanOlivers 的建议并改用 a 会更简单std::discrete_distribution


推荐阅读