【问题标题】:Generate a specific amount of random numbers that add up to a defined value生成特定数量的随机数,这些随机数加起来为定义的值
【发布时间】:2013-08-20 15:31:30
【问题描述】:

我想对我公司使用的时间编写软件进行单元测试。为了做到这一点,我想创建一组随机数,这些随机数加起来是一个定义的值。

我希望能够控制参数:

  • 生成数的最小值和最大值
  • 生成数字的 n 个
  • 生成数字的总和

例如,一个人在 250 天内工作了 2000 小时。 2000 小时必须在 250 天内随机分布。每天花费的时间最长为 9 小时,最少为 0.25

我通过this SO 问题找到了方法

diff(c(0, sort(runif(249)), 2000))

这会产生 1 个大数字和 249 个小数字。这就是为什么我能够为生成的数字设置最小值和最大值。但我不知道从哪里开始。

【问题讨论】:

  • runif 有最小和最大参数吗? runif( 249 , 0.25 , 9 )
  • 我怎么会错过那个!
  • 您在超平面(固定总和)和超立方体(固定最小值和最大值)的交点处进行采样。你想在这个域中保持均匀的密度吗?
  • 这里经常询问最后一项:如果您要限制随机数的总和,那么基本上您需要限制可能的值。例如,如果您想要 [0,1] 中的 100 个 RV 并且总和
  • 是的,我希望域中的密度均匀。

标签: r random


【解决方案1】:

满足三个约束中的任何两个都没有问题,但所有三个可能都是问题。正如您所注意到的,生成加到总和的 N 个随机数的标准方法是生成 0..sum 范围内的 N-1 个随机数,对它们进行排序,然后取差值。这基本上是将您的总和视为数轴,选择 N-1 个随机点,您的数字是点之间的段。

但这可能与数字本身的限制不兼容。例如,如果您想要 10 个数字加到 1000,但每个数字都必须小于 100,该怎么办?那是行不通的。即使您有数学上可能的范围,强制遵守所有约束也可能意味着牺牲均匀性或其他理想属性。

我怀疑这样做的唯一方法是保持总和约束、N 约束、执行标准的 N-1、排序和差异操作,但限制单个随机数的 分辨率到您想要的最小值(换句话说,可能生成 0..10 乘以 10,而不是 0..100)。

或者,不是沿线生成 N-1 个均匀随机点,而是在类似的低分辨率约束内沿线生成点的随机样本。

【讨论】:

  • 提醒 OP:基础分布的均匀性并不意味着给定采样的均匀性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2017-01-02
  • 2013-10-15
  • 2020-02-09
  • 2021-05-31
  • 2014-01-23
相关资源
最近更新 更多