在现代 C++ 中,我可以排除随机数范围内的数字或数字子范围吗?

Axo*_*xoy 5 c++ random c++11 c++17

我有:

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> probability(0, 100);
Run Code Online (Sandbox Code Playgroud)

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

我想知道是否可以在现代 C++ 中实现而不使用std::rand

for*_*818 10

如果你想继续使用 a,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;
Run Code Online (Sandbox Code Playgroud)

示例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;
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*k R 5

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

这就是std::piecewise_constant_distribution的用途。

    std::vector<int> i{0,  4, 8, 101};
    std::vector<int> w{ 4,  0,  93};
    std::piecewise_constant_distribution<> d(i.begin(), i.end(), w.begin());
Run Code Online (Sandbox Code Playgroud)

现场演示