Java 正面或反面练习:随机课堂

Java 正面或反面练习:随机课堂,java,random,Java,Random,我制作了一个非常简单的随机发生器,可以是正面的,也可以是反面的。 当玩100次时,结果总是在最大60/40左右波动。换句话说:我从来没有得到过35-65,甚至25-75的结果。 我发现有一点值得注意的是,我经常得到50/50的结果。 这是什么原因 这是我的主要类(名为“play”的方法): 生成随机数的My HeadsOrTails类: package headsOrTails; import java.util.Random; public class HeadsOrTails {

我制作了一个非常简单的随机发生器,可以是正面的,也可以是反面的。
当玩100次时,结果总是在最大60/40左右波动。换句话说:我从来没有得到过35-65,甚至25-75的结果。

我发现有一点值得注意的是,我经常得到50/50的结果。
这是什么原因

这是我的主要类(名为“play”的方法):

生成随机数的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++; 
            }
        }

    } 
} 
包装头套;
导入java.util.Random;
公营船首帆{
私有行数;
私有整数totalTails;//0
私有整数totalHeads;//1
//建造师
公共大门栏杆(整排){
this.nrOfThrows=nrOfThrows;
} 
public int getTotalTails(){
返回这个.totalTails;
} 
public int getTotalHeads(){
返回这个。totalHeads;
} 
公共无效播放(){
for(int i=0;i
随机类的行为应该是这样的。这些值应在所有可能的结果之间平均分配。在你的例子中是0和1。
你尝试得越少,波动就越大。所以你应该减少重复次数。

我认为这是因为掷硬币的概率分布。如果你减少你的tossingloop,你会意识到分布正在远离50/50,但是如果你增加迭代次数,比如说10000次,你可能会得到一个非常接近50/50的分布。检查大数定律。
这是一个数学定律,不依赖于你写的类。

我不是随机数方面的专家,但javadoc声明
Random.nextInt(int)
生成均匀分布的整数。 因此,如果尝试的次数足够多,人们会期望结果接近50/50。换言之,使用Random.nextInt(2)您看到0的可能性与看到1的可能性相同。

尝试以下方法:

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);
}
}
这或多或少是你所期望的。。你经常看不到任何差别,然后179/2=~90倍于1的差别,差别越大,可能性越小


正如其他人已经说过的,看看概率,以理解为什么会出现这种情况;-)

你将100次独立投币相加,每次投币的正面或反面概率相等。在概率中,这是n=100,p=0.5的二项分布的精确定义,描述为
k~二项(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

P{40你真的应该看看是什么。因为大多数人不是荷兰人,所以我认为用英语名称替换变量和方法名称更有意义。“我发现有一点值得注意的是,我通常得到50/50的结果。”请解释一下你的期望以及为什么你觉得这很了不起。随机数生成器的目标不是公平吗(如果没有其他指示)?除非你的意思是你对它的效果感到惊讶。看:如果你只画一次,你会在相同的值上得到100%的画。这不是更值得注意吗?我怀疑我的方法是否正确,但我现在看到,你玩得越多,你就越有可能达到50。我从来没有对概率学过很多东西,我会研究它静息测试,对我来说很新。我会更多地研究概率。谢谢。
[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]
P{40 <= k <= 60} = 0.9647997998
P{35 <= k <= 65} = 0.9982100696
P{30 <= k <= 70} = 0.999967840
P{25 <= k <= 75} = 0.999999819