随机均匀分布

问题描述:

所以我想要在Java中获得统一分布的列表的随机元素。我知道,在Random类,例如nextInt方法,已经给我这样的事情:随机均匀分布

返回介于0(含)伪随机,均匀分布的int值和指定值(不包括),从画这个随机数发生器的序列。

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

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次,换句话说,至少一次?

+4

如果你保证它,那么它是不是随机的... – irrelephant 2014-11-08 05:06:09

+0

在(离散)均匀分布中,每个值具有相等的**机会**发生。这并不意味着每个值都会出现相同的时间。你的代码对于小的“n”没有任何问题。 – 2014-11-08 05:31:58

+0

你想要它是统一的随机数,还是你想看到每个数字相等的次数? – immibis 2014-11-08 05:33:30

如果您想生成的数字发生的次数完全相同(与统一分布不同),那么有一个更好的方法可以做到这一点。

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,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); 
} 
+0

更改for循环策略,它几乎看起来像我期待的。考虑到“t = 10”,按照你所做的方式,我会随机从范围[0-9]中两次获得数字,这将会得到保证。但我希望能像20次迭代一样,每个数字都被访问1-3次,但至少有一次。 – 2014-11-08 05:57:10

+0

如果t = 10,n = 2,则得到数字0和1的10倍。 – 2014-11-08 15:32:17

+0

好吧,您设法得到我期待的结果,并带来一个很好的解决方法。但我不认为这会给我更好的表现,就像你说的那样“在(离散)均匀分布中,每个值都有相等的发生机会,并不意味着每个值的出现次数相等时间“,我无法保证。 – 2014-11-08 19:04:38