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

标签 c++ math random distribution

我正在努力使用 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/

相关文章:

c++ - 使C++全速运行

algorithm - 根据坐标查找哪个区域包含一个点

audio - A帧:单击时播放随机声音

c# - 如何在 C# 中使用随机数?

java - 不同语言(即 Java 和 C++)的 "random"生成器如何比较?

c++ - 使用 Eclipse CDT 调试 ncurses

c++ - 准备调用 ParseAST。 fatal error

c++ - GCC 4.9 constexpr 错误的解决方法

java - 垂直枚举分组列

math - float 学坏了吗?