Math 把一个随机数生成循环变成一个等式?

Math 把一个随机数生成循环变成一个等式?,math,optimization,pseudocode,Math,Optimization,Pseudocode,下面是一些伪代码: count = 0 for every item in a list 1/20 chance to add one to count 这或多或少是我当前的代码,但列表中可能有数十万项;因此,它很快就会变得效率低下。(这不是叫做,0(n)或其他什么吗?) 有没有办法把它压缩成一个等式?让我们看看你描述的随机变量的特性。引述: 参数为n和p的二项式分布是n个独立的是/否实验序列中成功次数的离散概率分布,每个实验的成功概率均为p 假设N是列表中的项目数,C是一个随机变量,

下面是一些伪代码:

count = 0
for every item in a list
    1/20 chance to add one to count
这或多或少是我当前的代码,但列表中可能有数十万项;因此,它很快就会变得效率低下。(这不是叫做,
0(n)
或其他什么吗?)


有没有办法把它压缩成一个等式?

让我们看看你描述的随机变量的特性。引述:

参数为n和p的二项式分布是n个独立的是/否实验序列中成功次数的离散概率分布,每个实验的成功概率均为p

假设
N
是列表中的项目数,
C
是一个随机变量,表示从伪代码中获得的
计数<代码>C
将遵循二项概率分布(如下图所示),p=1/20:

剩下的问题是如何用这种概率分布有效地轮询一个随机变量。有许多库允许您使用指定的PDF从随机变量中提取样本。我从来没有自己实现过它,所以我不知道具体细节,但很多都是开源的,你可以自己参考实现

下面是如何使用Python中的库计算
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)个运行时

在某些解释语言中,使用更紧凑的语法可能会在运行时的常量方面产生明显的差异。其他因素可能会影响运行时,例如是存储所有随机值然后进行处理,还是在没有临时存储的情况下动态处理它们


所有这些都不允许您避免运行时以n线性递增。

这难道不意味着计数是一个随机变量,如果list.length很大,那么它的平均值=list.length/20,标准偏差=sqrt(19/20/20)/sqrt(list.length)?是的,但我对标准偏差之类的东西一无所知。我在本该学这种东西的那一年就不再学数学了=(一个可读答案的“代码行数”取决于语言。就这一点而言,“代码行数”通常也不是衡量性能的有用指标。好吧,这不是真正的重点。我只是想基本上不产生循环。我改变了措辞。OP希望“将[上面的代码]…压缩成一个等式”,所以这基本上是不相关的。@Asad:他说“[列表可能很大],因此效率很快就会降低”。IDK如果他认为将其作为一个单行将使其成为O(1),或者如果他只是想避免实际初始化临时列表,减少其O(1)中的常数因子。他对该问题的最后评论是“基本上,我只是不想有一个循环”,所以我认为这个答案与老年退休金计划对什么是慢什么是快的误解非常相关“OP指的是一个封闭形式的表达式,即通过对单个PRG数进行算术运算产生结果的表达式。这不涉及对值列表的迭代,因此它是O(1)。虽然我认为这实际上不可能,但肯定有可能改进O(n)朴素实现的性能。@麦肯齐·麦克莱恩:你不需要使用技术语言。你可以问:“我如何才能有效地得到与我从中得到的随机数相似的随机数?我的实现必须在循环中调用RNG N次才能得到答案,这对于大N来说是很慢的。”如果你感到计算机科学,你可以说“我的实现是O(N)。有没有更快的方法,最好是O(1)?”了解这类事情的人很快就会明白,你想要一个简单的公式,将一个或两个RNG输出转化为你想要的,而不管N。无论如何,希望这对你将来的提问有所帮助。:)不可能想到有人可能会误解你表达问题的方式的所有方式,特别是如果(因为显而易见的原因,这是很常见的)你在问一些你还不知道的事情。但至少尝试一下,如果你觉得你不得不说一些其他的背景材料,可能会让读者觉得你在想一些其他的事情,那么可以包括一个问题的摘要。