二项式随机数生成 我正在努力在C++中获得随机数生成器。 生成器应仅返回0和n之间的整数 返回低数值的概率应高于返回高数值的概率

二项式随机数生成 我正在努力在C++中获得随机数生成器。 生成器应仅返回0和n之间的整数 返回低数值的概率应高于返回高数值的概率,c++,math,random,distribution,C++,Math,Random,Distribution,分发示例: 1: ************************ 2: ****************** 3: ************** 4: ************ 5: ******** 6: ***** 7: **** 8: *** 9: ** 10: * 在我的案例中,分发类型并不重要。我所尝试的是使用二项分布的值[0..2*n]。之后,我将得到的随机数转换为[0..n],以得到零处的峰值 size_t n = 20; std::default_rando

分发示例:

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);

我的问题是:如何正确实现这样的算法?如何提高较高值的概率,使分布保持不变,而不考虑使用的
n

我使用以下解决方法:

do {
        number = (rand() % n) - (rand() % n);
} while(number < 0 || number > n);
do{
数字=(rand()%n)-(rand()%n);
}而(数<0 | |数>n);
这提供了一个正确的分布,但速度非常慢,因为每个数字大约需要0.9次重试。

您可以生成

适当的参数λ对衰减速度有影响

如果您的数学库中没有现成的指数分布(std::指数分布?),只需使用

德尔菲示例

 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;
对于i:=0到1000000,开始
V:=Trunc(-ln(Random())/lambda);
//随机函数给出均匀分布在[0,1]上的随机值

如果您可以为生成函数的特定调用次数生成0到n/2之间的随机数,然后切换回从0到n的生成;来回切换会使较低值的计数增加。您可以对此进行概括。@user2296177这是一个有趣的想法。但随机性的质量不太好你试过几何分布吗?为什么不试一下呢?
P(x) = lambda * Exp(-lambda * x)
 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;