0

请帮助我根据用户输入 %'s 生成随机数。
例如,输入为 60,10 和 30,输出应为:

60% 0-70 范围内
的随机数 10% 70-80
的随机数 30% 80 以上范围内的随机数

我应该使用多范围生成器吗?
或者所有的可能性是什么?

这是代码:

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

class RandomInRanges
{
    private final List<Integer> range = new ArrayList();

    RandomInRanges(int min, int max)
    {
        this.addRange(min, max);
    }

    final void addRange(int min, int max)
    {
        for(int i = min; i <= max; i++)
        {
            this.range.add(i);
        }
    }

    int getRandom()
    {
        return this.range.get(new Random().nextInt(this.range.size()));
    }

    public static void main(String[] args)
    {
        RandomInRanges rir = new RandomInRanges(1, 200);
        rir.addRange(50, 60);
        System.out.println(rir.getRandom());
    }
}
4

1 回答 1

4

一般的方法可能如下:

  • 根据频率,将单位区间 (0, 1) 划分为区域。
  • 定义从每个分区元素到相应所需范围的线性映射。
  • 生成均匀分布在 (0, 1) 上的随机数。
  • 根据每个随机数落在 (0, 1) 的哪一部分,应用适当的映射。

使用您发布的示例,范围将是 (0, .6), (.6, .7), (.7, 1)。第一个映射将从 (0, .6) 到 (0, 70):y = 70 * x / 0.6。第二个映射将从 (0.6, 0.7) 到 (70, 80):y = 70 + 100 * (x - 0.6)。第三个映射需要知道您想要生成的最大数量。

以上适用于多个范围内的连续均匀分布。请注意,范围都是开放的(对于连续分布来说,这不是问题,因为恰好到达边界点的概率为零,并且可以任意解决平局。如果您想对整数值执行此操作,您可以使用相同的方法并取底结果。需要注意一点,以确保正确处理端点,以避免引入偏差。

最后(希望很明显):这仅在所需的输出范围不相交时才有效。对于具有连续范围的离散分布(如您的示例),这将需要确定每个边界点落在哪个范围内。

于 2013-09-24T21:41:24.550 回答