将随机数生成循环变成一个方程式?
Turning a random number generating loop into a one equation?
这是一些伪代码:
count = 0
for every item in a list
1/20 chance to add one to count
这或多或少是我当前的代码,但该列表中可能有数十万个项目;因此,它很快就会变得低效。 (这不是叫 0(n)
之类的吗?)
有没有办法将其压缩为一个等式?
让我们看看您描述的随机变量的属性。引用 Wikipedia:
The binomial distribution with parameters n and p is the discrete probability distribution of the number of successes in a sequence of n independent yes/no experiments, each of which yields success with probability 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
显然,OP 正在寻求一种更有效的方法来生成具有相同分布的随机数。我虽然问题是如何执行与循环完全相同的操作,但作为一个衬里(最好没有临时列表,只是为了迭代)。
如果您对随机数生成器进行 n 次采样,则无论代码看起来如何,它最多只需要 O(n) 运行 次。
在一些解释性语言中,使用更紧凑的语法可能会在 运行 时间的常数因子上产生显着差异。其他因素会影响 运行 时间,例如您是存储所有随机值然后 然后 处理它们,还是在没有临时存储的情况下即时处理它们。
None 这样可以避免 运行 时间随 n 线性增加。
这是一些伪代码:
count = 0
for every item in a list
1/20 chance to add one to count
这或多或少是我当前的代码,但该列表中可能有数十万个项目;因此,它很快就会变得低效。 (这不是叫 0(n)
之类的吗?)
有没有办法将其压缩为一个等式?
让我们看看您描述的随机变量的属性。引用 Wikipedia:
The binomial distribution with parameters n and p is the discrete probability distribution of the number of successes in a sequence of n independent yes/no experiments, each of which yields success with probability 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
显然,OP 正在寻求一种更有效的方法来生成具有相同分布的随机数。我虽然问题是如何执行与循环完全相同的操作,但作为一个衬里(最好没有临时列表,只是为了迭代)。
如果您对随机数生成器进行 n 次采样,则无论代码看起来如何,它最多只需要 O(n) 运行 次。
在一些解释性语言中,使用更紧凑的语法可能会在 运行 时间的常数因子上产生显着差异。其他因素会影响 运行 时间,例如您是存储所有随机值然后 然后 处理它们,还是在没有临时存储的情况下即时处理它们。
None 这样可以避免 运行 时间随 n 线性增加。