我很难在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 :(得分:2)
P(x) = lambda * Exp(-lambda * x)
使用适当的参数lambda来影响衰减速度。
如果您的数学库中没有现成的指数分布(std :: exponential_distribution?),请使用inverse transform sampling (Smirnov's) method。
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;
答案 1 :(得分:0)
我使用以下解决方法:
do {
number = (rand() % n) - (rand() % n);
} while(number < 0 || number > n);
这给出了正确的分布,但是非常慢,因为每个数字需要大约0.9次重试。