【问题标题】:How to draw an n sample from U(a,b) of numbers not close?如何从不接近的 U(a,b) 中抽取 n 个样本?
【发布时间】:2020-09-28 15:00:45
【问题描述】:

我需要从区间 [a,b] 上的均匀分布中抽取一个 n 样本,这样没有两个数字比 d > 0 更接近。我可以抽取一个样本并检查此属性,然后将其丢弃并尝试再次,如果不是,但如果 n 相对于 ba 较大,则可能需要很长时间。有没有一个简单而好的算法来解决这个问题?这些数字必须均匀分布在 [a,b] 上,没有确定性的设置。

【问题讨论】:

  • 这是一个想法。从 U(0, 1) 的样本中从一个点到下一个更大点的距离有一些众所周知的分布——我忘了​​它是什么,但它类似于 1/x,我相信你可以查一下.来自该分布的样本,但排除任何小于 d 的样本。不能保证结果序列在 0 和 b - a 之间,所以我猜你还必须丢弃任何使总和太大的序列。
  • FWIW 这个问题不适合 SO;试试 stats.stackexchange.com。

标签: algorithm statistics


【解决方案1】:

这个问题等价于选择n个大于等于d且总和等于b-a的数。

如果n * d

b - a - X b - a - (n - 1) * d

FindSpacedSample(n, d, a, b)
1. if n * d > b - a then return "no solution"
2. avail = [d, b - a - (n - 1) * d]
3. guess = random(avail)
4. print(guess)
5. FindSpacedSample(n - 1, d, a + guess, b)

示例:n = 5,a = 0,b = 10,d = 1,假设为实数

FindSpacedSample(5, 1, 0, 10)
5 * 1 >? b - a? no
avail = [1, 10 - 0 - 4 * 1] = [1, 6]
guess = random(avail) = 2 (for the sake of argument)
print(2)

FindSpacedSample(4, 1, 2, 10)
4 * 1 >? 10 - 2? no
avail = [1, 10 - 2 - 3 * 1] = [1, 5]
guess = random(avail) = 4 (for the sake of argument)
print(4)

FindSpacedSample(3, 1, 6, 10)
3 * 1 >? 10 - 6? no
avail = [1, 10 - 6 - 2 * 1] = [1, 2]
guess = random(avail) = 1 (for the sake of argument)
print(1)

FindSpacedSample(2, 1, 7, 10)
2 * 1 >? 10 - 7? no
avail = [1, 10 - 7 - 1 * 1] = [1, 2]
guess = random(avail) = 2 (for the sake of argument)
print(2)

FindSpacedSample(1, 1, 9, 10)
1 * 1 >? 10 - 9? no
avail = [1, 10 - 9 - 0 * 1] = [1, 1]
guess = 1
print(1)

我们还应该有停止条件n = 0。然后我们得到空间序列2、4、1、2、1;我们看到这些总和为十;我们可以得到如下值:

point1 = 2                  = 2
point2 = 2 + 4              = 6
point3 = 2 + 4 + 1          = 7
point4 = 2 + 4 + 1 + 2      = 9
point5 = 2 + 4 + 1 + 2 + 1  = 10

现在,有几种方法可以使这个结果不完全一致:

  1. 第一个数字永远不会小于 d
  2. 较早的数字往往间隔更远

我们可以通过以下方式解决这些问题:

  1. 在转换为点之前调整间距
  2. 从每个点中减去 [0, point1 - a] 中的一些随机值。

所以,如果我们将 2、4、1、2、1 改组为 4、1、1、2、2,我们将得到 4、5、6、8、10 分;如果我们从每个中减去 3(在 0 和 4 之间随机抽取),我们会得到 1、2、3、5、7。

这是否为您提供了所有可能解决方案集的均匀分布?如果确实如此,我会感到惊讶,但如果这给您带来的结果与真正的均匀分布有明显的不同,我也会感到惊讶。

【讨论】:

  • 有趣:)。但是您正在生成订单统计信息,而不是变量本身。您的设置中没有第一个 var、第二个 var 等。你会如何修改它?另一个问题:为什么较早的数字往往间隔更远?可以通过使用区间 [a-d, b] 来修正一阶 var 永远不会小于 d 的问题。洗牌似乎没问题,但你真的需要吗?
  • 下一步绘制的间隔长度是 b - a - nd 。随着 n 下降,这上升!所以这些步骤不是均匀分布的。问题。
  • @Henrik4 关于您的第二条评论 - 请注意,a 随着每次递归调用而增加,这在某种程度上抵消了 nd 项。在你的第一个 - 从间距到点,你会按照我的说明将它们累积添加。在这里尝试分析结果分布的均匀性可能有点太难了,但是可以通过经验测试这种方法,看看结果的分布是否足以满足您的需求。
  • 啊哈,当您生成步骤 s1,...,sm 时,s(m+1) 的间隔变为 [d, b - a - sum(si) - (nm-1) *d],对吗?一个问题是这个间隔是随机的,所以所有的步骤都是不同的分布。您对订单统计信息的误解:您生成了有序的变量:x1
  • @Henrik4 你说得对,它是随机的......就像我说的,我怀疑它在所有可能的解决方案的空间中是完全一致的,但我的直觉说它看起来不错(什么解决方案比使用这种方法的另一个更有可能?)如果你不想要 point1
猜你喜欢
  • 2017-06-22
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2015-02-06
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多