gpt4 book ai didi

c++ - 二项式随机数生成

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:48 25 4
gpt4 key购买 nike

我正努力在 C++ 中获得一个随机数生成器。

  • 生成器应该只返回 0n 之间的整数。
  • 返回低数的概率应高于返回高数的概率。

示例分布:

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

最佳答案

您可以生成 exponential distribution

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com