生成范围内的随机整数以满足java中的百分位数

时间:2014-02-02 03:06:20

标签: java random

我试图在一个范围内生成随机整数来抽样该范围的百分位数。例如:对于范围1到100,我想选择20%的随机样本。这将导致20个随机选择为100的整数。

这是为了解决一个极其复杂的问题,一旦我得到了解决方案,我会发布解决方案。我没有在java中使用过很多数学包,所以感谢您的帮助。

谢谢!

4 个答案:

答案 0 :(得分:1)

将所有数字放入arraylist,然后将其洗牌。只采用arraylist的第一个元素:

ArrayList<Integer> randomNumbers = new ArrayList<Integer>();

for(int i = 0; i < 100; i++){
    randomNumbers.add((int)(Math.random() * 100 + 1));
}

Collections.shuffle(randomNumbers);

//Then the first 20 elements are your sample

答案 1 :(得分:1)

如果您想要20个1到100之间的随机整数,请使用Math.random()生成0到0.999之间的值...然后,操纵此值以适合您的范围。

int[] random = new int[20];
for(int i =0; i< random.length;i++)
{
   random[i] = (int)(Math.random()*100+1); 
}

当您将Math.random()乘以100时,您将获得介于0和99.999之间的值...对于此数字,您将添加1,从而产生介于1.0和100.0之间的值。然后,我使用(int)类型转换将数字转换为整数。这给出了1到100之间的数字。然后,将值存储到数组中。

答案 2 :(得分:0)

如果你愿意使用Java 8,你可以使用lambdas的一些功能。假设您没有保留20%的PB级数据,您可以执行类似这样的操作(数字是要获得的范围内的整数),它没有丝毫的效率,但它有效,如果你想做一些Java 8.但如果这对性能至关重要,我不推荐它:

public ArrayList<Integer> sampler(int min, int max, int number){
    Random random = new Random();
    ArrayList<Integer> generated = new ArrayList<Integer>();
    IntStream ints = random.ints(min,max);
    Iterator<Integer> it = ints.iterator();
    for(int i = 0; i < number; i++){
       int k = it.next();
       while(generated.contains(k)){
           k = it.next();
       }
       generated.add(k);
    }
    ints.close();
    return generated;
}

答案 3 :(得分:0)

如果您确实需要扩展到数PB的数据,那么您将需要一个不需要将所有数字保存在内存中的解决方案。即使是一个比特集,它会将你的数字压缩为每8个整数1个字节,也不适合内存。

由于你没有提到数字必须被洗牌(只是随机),你可以开始计算并随机决定是否保留每个数字。然后将结果流式传输到文件或任何需要的位置。

从这开始:

    long range = 100;
    float percentile = 0.20f;
    Random rnd = new Random();
    for (long i=1; i < range; i++) {
        if (rnd.nextFloat() < percentile) {
            System.out.println(i);
        }
    }

您将获得 20%的数字,从1到100,没有重复数据。

随着范围的增加,精度也会提高,所以对于大型数据集你真的不需要任何特殊的逻辑。

如果需要一个确切的数字,你需要特殊的逻辑来处理较小的数据集,但是使用此处发布的其他方法很容易解决(尽管我仍然建议使用一些设置)。