随机均匀分布

时间:2014-11-08 05:03:00

标签: java random

所以我想在Java中获得具有统一分布的列表的随机元素。我知道在Random类中,例如nextInt方法,已经给我这样的东西了:

  

从此随机数生成器的序列中返回一个伪随机,均匀分布的int值,介于0(包括)和指定值(不包括)之间。

所以给出类似下面的代码:

Random rnd = new Random();
int numTimes = 10;
for(int i = 0; i < numTimes*n; i++){
   System.out.println(rnd.nextInt(10));
}

我希望对于小“n”我不能看到良好的均匀分布,可能会增加它,我会看到更好的东西。所以我的问题是,我怎样才能保证在较小的n内均匀分布,换句话说,“n = 2”我怎样才能得到每个数字至少一次?


尝试更好地解释:给出10个数字范围的数据集,例如20个迭代,是否有一种方法可以将每个数字打印1-3次,换句话说,至少一次?

1 个答案:

答案 0 :(得分:0)

如果要生成完全相同次数的数字(与统一分布不同),则有更好的方法。

int n = 2; // your "n"
int t = 100; // how often you want each number x to occur, where 0 <= x < n

// Build a list of numbers
List<Integer> l = new ArrayList<>();
for (int i = 0; i < t; i++) {
    for (int j = 0; j < n; j++) {
        l.add(j);
    }
}
// Shuffle the list randomly; this ensures the order is random but each number x occurs
// as often as any other x
Collections.shuffle(l);

for (Integer value : l) {
    System.out.println(value);
}

如果你想至少有一些数字,但不关心其他数字;然后插入您想要至少一次的每个数字中的1个,其余随机插入。如果我理解正确,你需要数字1,2和3至少一次,然后随机数字1,2和3.所以,那将是:

int n = 3; // your "n"

// Build a list of numbers
List<Integer> l = new ArrayList<>();
for (int x = 1; x <= n; x++) {
     l.add(x);
}

int t = 17; // add 17 more random numbers in range 1-3 inclusive

for (int i = 0; i < t; i++) {
    l.add(rnd.nextInt(n) + 1);
}

// Shuffle
Collections.shuffle(l);

// Print
for (Integer value : l) {
    System.out.println(value);
}