【发布时间】:2016-07-31 11:32:05
【问题描述】:
我正在努力在 C++ 中获得一个随机数生成器。
- 生成器应该只返回介于
0和n之间的整数。 - 返回小数的概率应高于返回大数的概率。
示例分布:
1: ************************
2: ******************
3: **************
4: ************
5: ********
6: *****
7: ****
8: ***
9: **
10: *
在我的情况下,分发类型无关紧要。我尝试的是使用值为[0..2*n] 的二项分布。之后,我将生成的随机数转换为[0..n] 以使峰值为零。
size_t n = 20;
std::default_random_engine generator;
std::binomial_distribution<int> distribution(n*2, 0.5f);
int number = fabs(distribution(generator)-n);
结果数字:
0: *************************
1: ***********************************************
2: *****************************************
3: ********************************
4: **********************
5: **************
6: ********
7: ****
8: **
9:
10-20: none. The numbers are very rare.
我的问题:你如何正确实现这样的算法?如何增加较高值的概率,以使分布保持不变,而不管使用的n如何?
【问题讨论】:
-
您可以为一定次数的生成函数调用生成介于 0 和 n/2 之间的随机数,然后切换回从 0 到 n 的生成;来回切换应该会给您更多的较低值。你可以概括一下。
-
@user2296177 这是一个有趣的想法。但是随机性的质量不够好
-
你试过
std::geometric_distribution吗?
标签: c++ math random distribution