【问题标题】:Generating random numbers with known mean and variance生成具有已知均值和方差的随机数
【发布时间】:2010-10-31 01:25:25
【问题描述】:

从我正在阅读的一篇论文中知道:

...
S(t+1, k) = S(t, k) + ... + C*∆
...
∆ is a standard random variable with mean 0 and variance 1.
...

如何用这个均值和方差生成这一系列随机值?如果有人有指向 C 或 C++ 库的链接,我会很高兴,但如果有人告诉我该怎么做,我不介意自己实现它:)

【问题讨论】:

    标签: random


    【解决方案1】:

    您可以使用Box-Muller transform

    假设U1和U2是均匀分布在区间(0, 1]内的独立随机变量。设

    那么 Z0 和 Z1 是独立随机变量,标准差为 1 的正态分布。

    【讨论】:

    • 他没有说他需要一个正态/高斯分布,所以只是按比例放大均匀会减少工作量。但如果他需要高斯,你的方法就是要走
    【解决方案2】:

    你对\Delta的分发有什么限制吗?如果不是,您可以在[-sqrt(3), sqrt(3)] 中使用统一分布。这会起作用的原因是因为对于均匀分布[a,b],方差是1/(12) (b-a)^2

    【讨论】:

    • @srean 我现在试图复制结果的论文没有对 Δ 的分布指定任何类型的限制。
    • 那么我建议的将是最简单的方法。只需调用您的 rand 函数并相应地对其进行缩放,使其位于 [-sqrt(3), sqrt(3)] 而不是 [0,1]
    • @srean 你是如何找到 sqrt(3) 值的?
    • @Vitor。查看制服方差的公式。它是1/(12) (b-a)^2。使平均0 的最简单方法是对称的,所以我们选择a = -b。现在将其代入方差公式并求解,您将得到 sqrt(3)。希望这有帮助。我的回答应该更清楚。
    • @Vitor 让我知道我是否应该在答案中添加更多内容
    【解决方案3】:

    Waffles 是一个成熟、稳定的 C++ 库,您可以使用。特别是,*waffles_generate* 模块中的 noise 函数会做你想做的事。

    除了中心和散布(均值和标准差)外,还需要知道随机数从中抽取的概率分布。如果您正在阅读的论文对此没有任何说明,并且没有上下文支持的其他合理推断,那么作者可能指的是正态分布(高斯)——因为这是最常见的,并且因为这两个参数需要完全指定正态分布的是均值和标准差。许多分布没有以这种方式指定——例如,对于 Gamma 分布,需要形状、比例和速率;要指定一个Logistic,你需要位置和规模等。

    【讨论】:

    • 论文作者没有必要隐含一个高斯随机变量。在很多统计分析中,你关心的只是时刻。在这种特殊情况下,它似乎只是前两个时刻。所以@Vitor 可以灵活地选择满足要求但最容易实现的发行版。
    【解决方案4】:

    如果您只想要某个均值 0 和方差 1,那么最简单的可能就是这个。您是否有一个统一的随机数生成器unif() 可以为您提供介于 0 和 1 之间的数字?如果您希望数字非常接近正态分布,只需将 12 个均匀 (0,1) 数字相加并减去 6。如果您希望它真正完全是正态分布,您可以使用 Box-Muller 变换,正如 Mark 建议的那样,如果您不介意输入对数、正弦和余弦。

    【讨论】:

    • 这相当于 [*.com/questions/4061446/…。但是不必要地调用随机数生成器可能会很昂贵。它更容易调用一次并缩放和转移输出。有一个对 sqrt(3) 的调用,但只需要一次。
    • @srean:你是对的,对于制服。对于法线,我没有计时,但对数、正弦和余弦调用可能需要更多时间。这是假设时间甚至是一个问题。可能不是。