【问题标题】:Generate random small numbers with a target average生成具有目标平均值的随机小数
【发布时间】:2013-07-18 12:37:22
【问题描述】:

我需要编写一个随机返回数字 (-2,-1,0,1,2) 的函数,但我需要输出的平均值为特定数字(例如 1.2)。

我看到了similarquestions,但是所有的答案似乎都依赖于目标范围足够宽。

有没有办法通过这个小范围的可能输出来做到这一点(不保存状态)?

更新:我想将此函数用于(随机)测试,作为我不想运行的昂贵函数的存根。这个函数的使用者运行了几百次并取平均值。我一直在用一个简单的randint函数,但是平均值总是很接近0,这不太现实。

重点是,我只需要一些不会总是平均为 0 的简单数据。我并不关心实际的平均数是多少。我可能问错了问题。

【问题讨论】:

  • 任何合理的 RNG 都会保存状态,因此如果没有某种形式的状态保存,您将无法解决您的问题,尽管它隐藏在 random() 系统调用中。此外,如果您需要总体平均值,那么如果没有至少保存的运行平均值,就很难找到解决方案。
  • @rossum - 不,不需要状态保存。 MvG 指出了一个有效的解决方案,通过调整离散概率以获得目标均值。
  • MvG 为您的类似问题提供了出色的无状态解决方案。他解决的是“期望值”问题,而不是“要求均值”问题。作为替代方案,(1.2 - 2) + rand(5) 呢?这实际上是从 (-0.8, 0.2, 1.2, 2.2, 3.2) 中挑选,即从具有所需平均值的集合中随机挑选。

标签: math random language-agnostic


【解决方案1】:

您真的是要要求该特定值是平均值,或者更确切地说是expected value?换句话说,如果生成的序列在其初始部分包含非常多的小值,那么序列的其余部分是否应该尝试补偿这一点以试图获得整体平均值?我假设不是,我假设您希望独立计算所有样本(毕竟,您说过您不想要任何状态),在这种情况下您只能控制预期值。

如果您为每个可能的选择分配一个概率pi,那么预期值将是这些值的总和,由它们的概率加权:

EV = - 2p-2 - p-1 + p1 + 2p2 = 1.2

作为附加约束,您必须要求这些概率中的每一个都是非负的,并且上述四个加起来的值小于 1,余数为第五个概率 p 0.

有许多可能的任务可以满足这些要求,任何人都会按照你的要求去做。哪些对您的应用程序是合理的取决于该应用程序的作用。

您可以使用 PRNG 生成在 [0,1) 范围内均匀分布的变量,然后通过将概率的累积总和作为切点将它们映射到您描述的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2014-11-03
    相关资源
    最近更新 更多