0

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

我希望能够控制参数:

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

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

我通过this SO question工作并找到了方法

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

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

4

1 回答 1

0

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

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

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

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

于 2013-08-20T17:00:22.040 回答