我试图在随机生成器中获得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倍。
答案 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)
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)
您已经成功创建了一个随机生成器,以相同的概率返回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设置相同的数字?
我能想出的最好(幽默)的答案是:“以无限循环运行它。”