我需要在a
和b
之间生成n
个随机数,但是任意两个数的差值不能小于 C
。除了 n
之外的所有变量都是 float (n
是一个 int)。
解决方案首选java,但C/C++也可以。
这是我到目前为止的代码:
static float getRandomNumberInRange(float min, float max) {
return (float) (min + (Math.random() * (max - min)));
}
static float[] randomNums(float a, float b, float c, int n) {
float minDistance = c;
float maxDistance = (b - a) - (n - 1) * c;
float[] randomNumArray = new float[n];
float random = getRandomNumberInRange(minDistance, maxDistance);
randomNumArray[0] = a + random;
for (int x = 1; x < n; x++) {
maxDistance = (b - a) - (randomNumArray[x - 1]) - (n - x - 1) * c;
random = getRandomNumberInRange(minDistance, maxDistance);
randomNumArray[x] = randomNumArray[x - 1] + random;
}
return randomNumArray;
}
如果我这样运行该函数(10 次),我会得到以下输出:
输入:randomNums(-1f, 1f, 0.1f, 10)
[-0.88, 0.85, 1.23, 1.3784, 1.49, 1.59, 1.69, 1.79, 1.89, 1.99]
[-0.73, -0.40, 0.17, 0.98, 1.47, 1.58, 1.69, 1.79, 1.89, 1.99]
[-0.49, 0.29, 0.54, 0.77, 1.09, 1.56, 1.69, 1.79, 1.89, 1.99]
最佳答案
我认为合理的做法可以是:
- 总“空间”是
(b - a)
- 去掉最小所需空间
(n-1)*c
得到剩余空间 - 拍摄
(n-1)
介于 0 和 1 之间的随机数并缩放它们,以便总和就是刚刚计算的“可选空间”。它们中的每一个都将是要使用的空间“片”。 - 第一个数字是
a
- 对于每个其他数字,将
c
和下一个“切片”添加到前一个数字。最后一个数字将是b
。
如果您不希望 first 和 last 完全匹配 a
和 b
那么只需创建 n+1
切片而不是 n-1
并以 a+slice[0]
而不是 a
开始。
主要思想是,一旦删除点之间所需的间距(总计 (n-1)*c
),问题就是找到 n-1
值,以便总和是规定的“可选空间”。要使用均匀分布做到这一点,只需拍摄 n-1
数字,计算总和并统一缩放这些数字,以便通过将每个数字乘以常数因子 来得到您想要的总和k = wanted_sum/current_sum
.
要获得最终结果,您只需使用必填部分 c
和随机采样变量部分之一的总和作为值与前一个值之间的间距。
计算所需代码的 Python 示例如下
space = b - a
slack = space - (n - 1)*c
slice = [random.random() for i in xrange(n-1)] # Pick (n-1) random numbers 0..1
k = slack / sum(slice) # Compute needed scaling
slice = [x*k for x in slice] # Scale to get slice sizes
result = [a]
for i in xrange(n-1):
result.append(result[-1] + slice[i] + c)
关于java - 以增量方式生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6835287/