我正在努力使用 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?),只需使用 inverse transform sampling (Smirnov's) method 。
德尔福示例
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;
关于c++ - 二项式随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36529474/