这个问题等价于选择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
现在,有几种方法可以使这个结果不完全一致:
- 第一个数字永远不会小于 d
- 较早的数字往往间隔更远
我们可以通过以下方式解决这些问题:
- 在转换为点之前调整间距
- 从每个点中减去 [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。
这是否为您提供了所有可能解决方案集的均匀分布?如果确实如此,我会感到惊讶,但如果这给您带来的结果与真正的均匀分布有明显的不同,我也会感到惊讶。