当前位置: 首页 > 面试题库 >

产生poisson和二项式随机数的算法?

仲孙华奥
2023-03-14
问题内容

我一直在环顾四周,但是我不确定该怎么做。

我发现此页面在最后一段中说:

使用以下简单公式即可获得从poisson分布中提取的随机数的简单生成器:如果x 1,x 2,…是在零和一之间均匀分布的随机数序列,则k是第一个整数,乘积x 1 ·x 2 ·…·x k + 1 <e -λ

我找到了另一页 描述如何生成二项式数的页面,但是我认为它使用的是泊松生成的近似值,这对我没有帮助。

例如,考虑二项式随机数。二项式随机数是硬币N次抛掷的正面数目,其中任何一次抛掷的正面概率为p。如果您在间隔(0,1)上生成N个统一随机数,并计算出小于p的数,则该计数是具有参数N和p的二项式随机数。

我知道有图书馆可以做到这一点,但我不能使用它们,只能使用该语言提供的标准统一生成器(在这种情况下为Java)。


问题答案:

poisson分布

下面是维基百科说,克努特说,这样做:

init:
     Let L ← e^(−λ), k ← 0 and p ← 1.
do:
     k ← k + 1.
     Generate uniform random number u in [0,1] and let p ← p × u.
while p > L.
return k − 1.

在Java中,将是:

public static int getPoisson(double lambda) {
  double L = Math.exp(-lambda);
  double p = 1.0;
  int k = 0;

  do {
    k++;
    p *= Math.random();
  } while (p > L);

  return k - 1;
}

二项分布
继续阅读Luc Devroye(我从Wikipedia文章链接到该书)的非均匀随机变量生成(PDF)的第10章,可以得出以下结论:

public static int getBinomial(int n, double p) {
  int x = 0;
  for(int i = 0; i < n; i++) {
    if(Math.random() < p)
      x++;
  }
  return x;
}

请注意
这些算法都不是最优的。第一个是O(λ),第二个是O(n)。根据这些值通常的大小以及您需要调用生成器的频率,您可能需要更好的算法。我上面链接的论文有更复杂的算法,这些算法可以在恒定时间内运行,但是我会将这些实现留给读者练习。:)



 类似资料:
  • 问题内容: 我正在寻找一个随机数,并将其发布到特定user_id的数据库表中。问题是,相同的数字不能使用两次。有上百万种方法可以做到这一点,但是我希望对算法非常热衷的人能够以一种优雅的解决方案巧妙地解决问题,因为它满足以下条件: 1)最少查询数据库。2)通过内存中的数据结构进行的爬网次数最少。 本质上,这个想法是要执行以下操作 1)创建一个从0到9999999的随机数 2)检查数据库以查看该数字是

  • 随机数有着广泛的用途。比如测试、游戏、仿真以及安全等领域都需要用到随机数。标准库所提供的多种可供选择的随机数产生器也恰恰反应了随机数应用范 围的多样性。随机数产生器由引擎(engine)和分布(distribution)两部分组成。其中,engine用于产生一个随机数序列或者伪随机数 序列;distribution则将这些数值映射到位于固定范围的某一数学分布中。关于分布的例子有:unifrom_i

  • 下面要介绍一个在模拟事件和游戏的程序中常用的组件。本节和下节开发一个结构良好、包括多个函数的游戏程序。程序中要使用前面介绍的大多数控制结构。 在赌场上,人人都关心的一个问题就是机会元素(element of chance),也就是赢钱的运气。这个机会元素可以用标准库中的rand函数引入计算机应用程序中。 考虑下列语句: i=rand(); rand 函数产生O到RAND_MAX之间的整数(这是<s

  • $RANDOM是Bash的一个返回伪随机 [1]整数(范围为0 - 32767)的内部函数(而不是一个常量或变量),它不应该用于产生加密的密钥. 例子 9-24. 产生随机整数 1 #!/bin/bash 2 3 # 每次调用$RANDOM都会返回不同的随机整数. 4 # 范围为: 0 - 32767 (带符号的16位整数). 5 6 MAXCOUNT=10

  • 本文向大家介绍javaScript产生随机数的用法小结,包括了javaScript产生随机数的用法小结的使用技巧和注意事项,需要的朋友参考一下 1.Math.random(); 结果为0-1间的一个随机数(包括0,不包括1) 2.Math.floor(num); 参数num为一个数值,函数结果为num的整数部分。 3.Math.round(num); 参数num为一个数值,函数结果为num四舍五入