我试图在随机生成器中获得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。
我试图在随机生成器中获得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。
一种方法:使用ArrayList<Integer>
填充五十个1和五十个2,然后调用Collection.shuffle(...)
。
使用 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
private int next() { return random.nextBoolean() ? 1 : 2; }
- ziddarth使用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
编辑: 我知道如果你想要完全达到50-50的结果,那么我的答案是不准确的。你应该使用预填充的集合,因为使用任何形式的随机性都不可能实现这一点。考虑到这一点,我的答案仍然适用于问题的标题,所以这就是它:
嗯,你不需要使用随机生成器来做到这一点。 作为来自JavaScript的人,我会选择一行代码:
return Math.random() > 0.5 ? 1: 2;
解释: Math.random() 返回0(含)到1(不含)之间的数字,因此我们只需检查是否大于0.5(中间值)。理论上有50%的机会这样做。
为了更通用的使用,可以将1:2替换为true:false
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;
}
}
这种方法比洗牌有优势,因为它会递增生成数字,所以不需要内存来存储数字。
您已经成功创建了一个随机生成器,它以相等的概率返回1
或2
。
正如其他人所提到的,您下一个要求是在100次试验中强制实现精确的50/50分布,这与随机数生成不符。如https://math.stackexchange.com/questions/12348/probability-of-getting-50-heads-from-tossing-a-coin-100-times所示,这种情况发生的现实期望只有约8%。因此,即使您可能希望得到50个每个数字,但这种精确的结果实际上相当罕见。
大数定律表明,随着试验次数的增加,您应该接近预期值。
因此,对于您的实际问题:如何使生成器在这种情况下产生相等数量的1和2?
我能想到的最好(幽默)的答案是:“无限循环运行它。”