二项式随机数生成
Binomial random number generation
我很难在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
?
您可以生成指数分布
P(x) = lambda * Exp(-lambda * x)
具有影响衰减速度的适当参数lambda。
如果您的数学库中没有现成的指数分布(std::exponential_distribution?),请使用逆变换采样(Smirnov)方法。
Delphi示例
for i := 0 to 1000000 do begin
V := Trunc(-ln(Random()) / lambda);
//Random function gives random value uniformly distributed on [0,1)
if V <= N then begin
Inc(H[V]); //histogram entry
end;
end;
我使用以下解决方法:
do {
number = (rand() % n) - (rand() % n);
} while(number < 0 || number > n);
这提供了一个正确的分布,但速度非常慢,因为每个数字大约需要0.9次重试。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 整数不会重复超过随机数
- if数组上的随机数
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 半随机数生成C++
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 具有随机数的二维数组不会更改
- 随机数未达到限制
- 我想生成许多矩阵并用随机数填充它
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 制作具有平均值的随机数生成器
- 为什么 rand 不在我的代码中生成随机数?
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 从给定种子生成相同的随机数序列C++
- 随机数生成函数说明
- C++ 尝试生成随机数时弹出警告帮助?
- 尝试在 c++ 中创建随机数生成器并收到错误
- 从给定的随机数组值生成随机数 Arduino程序C++
- 二项式随机数生成