java - 以增量方式生成随机数

标签 java c++ c random

我需要在ab之间生成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]

最佳答案

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

schema

  1. 总“空间”是(b - a)
  2. 去掉最小所需空间(n-1)*c得到剩余空间
  3. 拍摄 (n-1) 介于 0 和 1 之间的随机数并缩放它们,以便总和就是刚刚计算的“可选空间”。它们中的每一个都将是要使用的空间“片”。
  4. 第一个数字是a
  5. 对于每个其他数字,将 c 和下一个“切片”添加到前一个数字。最后一个数字将是 b

如果您不希望 first 和 last 完全匹配 ab 那么只需创建 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/

相关文章:

c++ - 在 Visual C++ 中 switch 是如何编译的,它的优化和速度如何?

c - sin 函数没有按预期工作

C 程序链接错误 : what is causing these?

java - 哪个更好,编写另一种方法还是向现有方法添加更多参数?

java - 为什么此 Java 流的一个版本在静态 map 上工作而另一个版本失败?

java - 扫描仪应该在这个程序中放在哪里?

java - 从另一个类调用方法并检索其结果 (Java)

c++ - 使用 msbuild 时抑制 C++ 'Post-Build Event'

c++ - libcurl 无法在 xcode 上运行

c - 如何自动检查 C 函数库是否符合可重入性?