将随机数生成循环转换为一个等式?

时间:2015-09-12 22:48:25

标签: math optimization pseudocode

这是一些伪代码:

count = 0
for every item in a list
    1/20 chance to add one to count

这或多或少是我当前的代码,但该列表中可能有数十万个项目;因此,快速效率低下。 (这不是叫0(n)或其他什么吗?)

有没有办法将其压缩成一个等式?

2 个答案:

答案 0 :(得分:2)

让我们看一下你所描述的随机变量的属性。引用Wikipedia

  

参数n和p的二项分布是n个独立的是/否实验序列中成功次数的离散概率分布,每个实验都以概率p得到成功。

N成为列表中的项目数,C是一个随机变量,代表您从伪代码中获取的countC将遵循二项式概率分布(如下图所示),p = 1/20:

enter image description here

剩下的问题是如何用所述概率分布有效地轮询随机变量。有许多库允许您使用指定的PDF从随机变量中绘制样本。我自己从来没有必须实现它,所以我不完全了解细节,但很多都是开源的,你可以自己参考实现。

以下是使用Python中的numpy库计算count的方法:

n, p = 10, 0.05                  # 10 trials, probability of success is 0.05
count = np.random.binomial(n, p) # draw a single sample

答案 1 :(得分:0)

显然OP正在要求一种更有效的方法来生成具有相同分布的随机数。我虽然问题是如何完成与循环完全相同的操作,但是作为一个衬里(并且最好没有临时列表存在只是为了迭代)。

如果您对随机数生成器进行n次采样,则无论代码如何运行,它都将具有最多O(n)运行时间。

在某些解释型语言中,使用更紧凑的语法可能会在运行时的常数因素方面产生显着差异。其他因素可能会影响运行时间,例如是否存储所有随机值以及然后处理它们,或者在没有临时存储的情况下即时处理它们。

这些都不会让您避免让您的运行时间与n。

呈线性关系
相关问题