我在头部或尾部做了一个非常简单的随机发电机 当播放100次时,结果总是在最大60/40的关系附近波动。换句话说:我从来没有得到让我们说35-65,甚至25-75的结果 我觉得有点值得注意的是,我经常得到50/50的结果 这是什么原因?
这是我的主要课程(方法名为" play"):
package headsOrTails;
public class App {
public static void main(String[] args) {
HeadsOrTails headsOrTails = new HeadsOrTails(100);
headsOrTails.play();
System.out.println(headsOrTails.getTotalHeads());
System.out.println(headsOrTails.getTotalTails());
}
}
My HeadsOrTails类生成随机数:
package headsOrTails;
import java.util.Random;
public class HeadsOrTails {
private int nrOfThrows;
private int totalTails; //0
private int totalHeads; //1
//Constructor
public HeadsOrTails(int nrOfThrows){
this.nrOfThrows = nrOfThrows;
}
public int getTotalTails(){
return this.totalTails;
}
public int getTotalHeads(){
return this.totalHeads;
}
public void play(){
for (int i = 0; i < this.nrOfThrows; i++) {
Random random = new Random();
int rnd = random.nextInt(2);
if(rnd == 0){
this.totalTails++;
} else {
this.totalHeads++;
}
}
}
}
答案 0 :(得分:3)
试试这个:
public class Rnd {
public static void main(final String[] args) {
int nrOfThrows = 100;
int[] diffNr = new int[nrOfThrows];
int plays = 1000;
for(int i=0; i<plays; i++) {
diffNr[play(nrOfThrows)]++;
}
System.out.println (Arrays.toString (diffNr));
}
static int play(final int nr) {
int heads = 0;
int tails = 0;
for (int i = 0; i < nr; i++) {
Random random = new Random ();
int rnd = random.nextInt (2);
if (rnd == 0) {
heads++;
} else {
tails++;
}
}
return Math.abs (heads-tails);
}
}
它将玩你的游戏一千次,并计算头尾之间的某种差异达到的频率。样本输出:
[68, 0, 179, 0, 130, 0, 127, 0, 127, 0, 99, 0, 85, 0, 45, 0, 46, 0, 37, 0, 28, 0, 10, 0, 10, 0, 1, 0, 2, 0, 2, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, ... only zeros from here]
这或多或少是你所期望的......你经常看到没有区别,然后179/2 =〜90倍差异,差异越大,它就越不可能。
正如其他人已经说过的那样,先了解概率,以了解为什么会出现这种情况; - )
答案 1 :(得分:1)
Random类应该表现得像这样。这些值应在所有可能的结果之间平均分配。在你的情况下0和1。 你尝试的越少,波动越大。那么你应该减少重复。
答案 2 :(得分:1)
我认为这是因为掷硬币的概率分布。如果你减少你的tossingloop,你会发现分布从50/50开始,但是如果你将迭代次数增加到10000,那么你可能会得到非常接近50/50的分布。检查大数定律。 它是一种数学定律,不依赖于你所写的类。
答案 3 :(得分:1)
我不是随机数的专家,但是javadoc说明了这一点
Random.nextInt(int)
生成一个均匀分布的整数。
因此,如果尝试次数足够多,则可以预期结果将接近50/50。换句话说,使用Random.nextInt(2)
,您很可能会看到0,因为您可能会看到1。
答案 4 :(得分:1)
你总计100个独立的硬币投掷,每个投掷都有相同的产生头或尾的概率。在概率上,这是二项分布的精确定义,其中n = 100且p = 0.5,描述为k ~ Binomial(100, 0.5)
。 k
在任何指定数字对之间的概率可以精确计算到浮点限制内:
P{40 <= k <= 60} = 0.9647997998
P{35 <= k <= 65} = 0.9982100696
P{30 <= k <= 70} = 0.999967840
P{25 <= k <= 75} = 0.999999819
如果您运行程序100次,您可能会看到少数(可能是2个,3个或4个)您的结果超出40-60范围的情况,并且不太可能看到结果更大的范围,除非你进行了更多的实验。在数千万次重复100次硬币投掷中,预计只会出现25-75之外的极端情况。
换句话说,您似乎正在准确地得到数学预测的结果 - 获得40-60范围之外的值很少见,并且越来越难以获得更大的差异。
该结果是统计假设检验的核心。如果你观察到在假设(假设)下你会处理一个公平的硬币极其罕见的结果,那么你拒绝这个假设并得出结论认为它不是一个公平的硬币。总有一些机会,它确实是一个公平的硬币,你有一个罕见的事件,但你可以选择你愿意容忍多少风险,通过选择结果必须达到极限的阈值,然后你拒绝假设