c++ - 具有不同可能性的随机整数

标签 c++ random

我想知道是否有办法在 A 和 b 之间生成一个随机数,如果一个数字满足特定要求,它比 A 和 B 之间的所有其他数字更有可能出现,例如:较低的数字更有可能出现,因此如果 A = 1 且 B = 10,则 1 最有可能出现,10 最不可能出现。

感谢所有帮助:)(抱歉英语/语法/问题不好)

最佳答案

C++11(你现在绝对应该使用它)添加了 <random> header 到 C++ 标准库。此 header 为 C++ 提供了更高质量的随机数生成器。使用 srand()rand()从来都不是一个很好的主意,因为没有质量保证,但现在它真的是不可原谅的。

在您的示例中,听起来您想要的可能是所谓的“离散三角分布”:概率质量函数看起来像一个三角形。在 C++ 中实现这一点的最简单(但可能不是最有效)的方法是 <random> 中包含的离散分布。 :

auto discrete_triangular_distribution(int max) {
    std::vector<int> weights(max);
    std::iota(weights.begin(), weights.end(), 0);
    std::discrete_distribution<> dist(weights.begin(), weights.end());
    return dist;
}

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    auto&& dist = discrete_triangular_distribution(10);
    std::map<int, int> counts;
    for (int i = 0; i < 10000; i++)
        ++counts[dist(gen)];
    for (auto count: counts)
        std::cout << count.first << " generated ";
        std::cout << count.second << " times.\n";
}

这对我来说给出了以下输出:

1 generated 233 times.
2 generated 425 times.
3 generated 677 times.
4 generated 854 times.
5 generated 1130 times.
6 generated 1334 times.
7 generated 1565 times.
8 generated 1804 times.
9 generated 1978 times.

比这更复杂的事情最好使用现有的分布之一(有人告诉我所有常用的统计分布都包括在内)或编写您自己的分布,这并不难:它只是必须是一个带有函数调用运算符的对象,该运算符采用随机位生成器并使用这些位来生成(在本例中)随机数。但是您可以创建一个生成随机字符串或任何任意随机对象的对象,也许用于测试目的)。

关于c++ - 具有不同可能性的随机整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39801831/

相关文章:

algorithm - 随机选择

javascript - 如何在 QWebView 中通过 C++ 触发 JavaScript 事件

c++ - 删除 void 指针时未调用析构函数

c++ - 使用CreateProcess()和CreatePipe()从cmd.exe重定向I/O

python - 如何在不提前生成整个序列的情况下生成可预测的序列改组?

javascript - 在 React 中为 HTML 标签生成随机类名时出现问题

C# 随机数生成器 -1 还是 1?

java - java语句的范围

c++ - 来自另一个后台进程的后台脚本的 pidof

c++ - 为什么在我的光线追踪器中计算阴影和反射时会丢失细节