以增量生成随机数

Ama*_*wal 2 c c++ java random

我需要na和之间生成随机数b,但是任何两个数字都不能有小于的差c.除n浮点数外的所有变量(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;
}
Run Code Online (Sandbox Code Playgroud)

如果我这样运行函数(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]

650*_*502 8

我认为合理的方法可以是:

模式

  1. 总"空间"是 (b - a)
  2. 删除所需的最小空间(n-1)*c以获取剩余空间
  3. 拍摄(n-1)0到1之间的随机数并对它们进行缩放,使得总和就是这个"可选空间".它们中的每一个都将是要使用的"切片"空间.
  4. 第一个数字是 a
  5. 对于每个其他数字添加c和下一个"切片"到前一个数字.最后一个号码b.

如果你不想要第一个和最后一个匹配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)
Run Code Online (Sandbox Code Playgroud)