29

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

例如:

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 生成相等的数字?

所以我希望这个循环生成 50 次数字 1 和 50 次数字 2。

4

6 回答 6

54

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

于 2013-03-08T02:25:31.473 回答
25

使用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
于 2013-03-08T10:01:59.080 回答
19

你不能用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
于 2013-03-08T02:28:24.370 回答
3

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

好吧,您不需要 rnd 生成器来执行此操作。来自 javascript,我会选择一个班轮:

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

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

对于更通用的用途,您只需将1:2替换为true:false

于 2020-01-29T15:16:27.227 回答
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;
  }
}

这比洗牌有一个优势,因为它以增量方式生成数字,因此不需要内存来存储数字。

于 2013-03-08T07:23:29.873 回答
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 生成相等的数字?

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

于 2013-03-16T21:18:07.330 回答