所以我想在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次,换句话说,至少一次?
答案 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);
}