这是一些伪代码:
count = 0
for every item in a list
1/20 chance to add one to count
这或多或少是我当前的代码,但该列表中可能有数十万个项目;因此,快速效率低下。 (这不是叫0(n)
或其他什么吗?)
有没有办法将其压缩成一个等式?
答案 0 :(得分:2)
让我们看一下你所描述的随机变量的属性。引用Wikipedia:
参数n和p的二项分布是n个独立的是/否实验序列中成功次数的离散概率分布,每个实验都以概率p得到成功。
让N
成为列表中的项目数,C
是一个随机变量,代表您从伪代码中获取的count
。 C
将遵循二项式概率分布(如下图所示),p = 1/20:
剩下的问题是如何用所述概率分布有效地轮询随机变量。有许多库允许您使用指定的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。
呈线性关系