头部或尾部锻炼:随机课

时间:2015-08-14 09:42:57

标签: java random

我在头部或尾部做了一个非常简单的随机发电机 当播放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++; 
            }
        }

    } 
} 

5 个答案:

答案 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范围之外的值很少见,并且越来越难以获得更大的差异。

该结果是统计假设检验的核心。如果你观察到在假设(假设)下你会处理一个公平的硬币极其罕见的结果,那么你拒绝这个假设并得出结论认为它不是一个公平的硬币。总有一些机会,它确实是一个公平的硬币,你有一个罕见的事件,但你可以选择你愿意容忍多少风险,通过选择结果必须达到极限的阈值,然后你拒绝假设