如何在随机发生器中获得50/50的机会

时间:2013-03-08 02:23:48

标签: java

我试图在随机生成器中获得50或50的机会获得1或2。

例如:

Random random = new Random();
int num = random.nextInt(2)+1;

此代码将输出1或2.

假设我在循环中运行它:

for ( int i = 0; i < 100; i++ ) {
    int num = random.nextInt(2)+1 ;
}

在这种情况下,如何让发生器为1和2制作相同的数字?

所以我希望这个循环产生数字1的50倍和数字2的50倍。

6 个答案:

答案 0 :(得分:52)

一种方法:用50个1和50个2填充ArrayList<Integer>,然后在其上调用Collection.shuffle(...)

答案 1 :(得分:18)

使用random无法实现此目的。如果你需要完全 50 1和50 2,你应该尝试这样的事情:

int[] array = new int[100];
for (int i = 0; i < 50; ++i)
 array[i] = 1;
for (int i = 50; i < 100; ++i)
 array[i] = 2;

shuffle(array); // implement shuffling algorithm or use an already existing one

答案 2 :(得分:17)

使用 Random.nextBoolean()

50/50非常简单
private final Random random = new Random();

private int next() {
  if (random.nextBoolean()) {
    return 1;
  } else {
    return 2;
  }
}

测试运行:

final ListMultimap<Integer, Integer> histogram = LinkedListMultimap.create(2);
for (int i = 0; i < 10000; i++) {
    nal Integer result = Integer.valueOf(next());
  histogram.put(result, result);
}
for (final Integer key : histogram.keySet()) {
  System.out.println(key + ": " + histogram.get(key).size());
}

结果:

1: 5056
2: 4944

答案 3 :(得分:2)

您可以调整沿途的概率,以便在获得更多的概率时减少概率。这样你并不总是有50%的机会获得一个,但你可以得到你期望的结果(恰好是50个):

int onesLeft = 50;

for(int i=0;i<100;i++) {
  int totalLeft = 100 - i;
  // we need a probability of onesLeft out of (totalLeft)
  int r = random.nextInt(totalLeft);
  int num;
  if(r < onesLeft) {
    num = 1;
    onesLeft --;
  } else {
    num = 2;
  }
}

这比改组更有优势,因为它会逐步生成数字,因此不需要内存来存储数字。

答案 4 :(得分:2)

编辑我了解,如果您希望准确地完成50-50个结果,那么我的答案是不准确的。您应该使用预先填充的集合,因为使用任何类型的随机性都无法实现。考虑到这一点,我的答案对于该问题的标题仍然有效,就这样:

那么,您不需要rnd生成器来执行此操作。 来自javascript,我只用一个衬里:

return Math.random() > 0.5 ? 1: 2;

说明: Math.random()返回一个介于0(含)和1(不含)之间的数字,因此,我们仅检查天气是否大于0.5(中间值)。从理论上讲,会有50%的变化。

对于一般用途,您可以将 1:2 替换为 true:false

答案 5 :(得分:0)

您已经成功创建了一个随机生成器,以相同的概率返回12

正如(很多)其他人提到的那样,你的下一个要求,即在100次试验中强制精确 50/50分布,不符合随机数生成。如https://math.stackexchange.com/questions/12348/probability-of-getting-50-heads-from-tossing-a-coin-100-times所示,对这种情况的现实期望仅为8%左右。因此,即使您可能期望每个 50,但完全结果实际上相当罕见。

大数定律表明,随着试验次数的增加,你应该接近期望值。

因此,对于您的实际问题:在这种情况下,如何使发生器为1和2设置相同的数字?

我能想出的最好(幽默)的答案是:“以无限循环运行它。”