多范围随机数发生器

时间:2013-09-24 19:45:37

标签: java random

请帮我根据用户输入%生成随机数 例如,输入为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());
    }
}

1 个答案:

答案 0 :(得分:3)

一般方法可能如下:

  • 根据频率,将单位间隔(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)。第三个映射需要知道您想要生成的最大数量。

以上工作适用于多个范围内的连续均匀分布。请注意,范围都是开放的(对于连续分布不是问题,因为精确命中边界点的概率为零,并且可以任意解决关系。如果要对整数值执行此操作,则可以使用采用相同的方法并对结果进行讨论。需要注意确保端点得到妥善处理,以避免引入偏差。

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