Java 为什么我的模拟没有找到无限的期望值?

Java 为什么我的模拟没有找到无限的期望值?,java,math,random,probability,Java,Math,Random,Probability,在Youtube视频(从6:09开始)中描述了一个实验,其中一个游戏有无限的期望值 我试图编写一个Java程序来找出一个长期的期望值(平均值)。理论上的期望值是无穷大,但我得到的是一些10左右的数字。是因为我的程序错了吗?因为我认为当实验数量足够大时,实验平均值将非常接近数学期望值。 这是我的节目 public class Main { public static final int NUM_EXPERIMENT = 1000000; public static void mai

在Youtube视频(从6:09开始)中描述了一个实验,其中一个游戏有无限的期望值

我试图编写一个Java程序来找出一个长期的期望值(平均值)。理论上的期望值是无穷大,但我得到的是一些10左右的数字。是因为我的程序错了吗?因为我认为当实验数量足够大时,实验平均值将非常接近数学期望值。 这是我的节目

public class Main {
    public static final int NUM_EXPERIMENT = 1000000;
    public static void main(String[] args) {
        int total = 0;
        for (int i = 0; i < NUM_EXPERIMENT; i++) {
            int counter = 1;
            int subtotal = 1;
            while ((int) (Math.random() * 2) == 0) {
                subtotal *= 2;
                counter++;
            }
            total += subtotal;
        }
        double expectation = total / (double) NUM_EXPERIMENT;
        System.out.println("The expectation of this experiment is " + expectation);
    }
}
公共类主{
公共静态最终int NUM_实验=1000000;
公共静态void main(字符串[]args){
int-total=0;
对于(int i=0;i
整数数据类型溢出。它们达到最大值并循环回到最小值。不能像那样做无限方程

整数值的范围是~
-2147 000 000到2147 000
,如果超过整数值的最大值,它将溢出到整数值的最小值。

我认为这与数学有关,与
int
s无关

您可能会注意到,如果您运行越来越多的试验,预期值将越来越大。期望值是无限的,因为有一些极不可能发生的事件会产生非常大的回报。你不太可能做到这一点,因为赚取2n利润的概率是2-n。例如,这意味着获得1000000美元(约220美元)的概率约为1/220。按照预期,在看到这种情况发生之前,您需要运行一百万次试验。因此,如果你只进行了十万次试验,你不会期望看到这样的事情发生。然而,随着试验次数的增加,你击中这些序列之一的概率增加,因此期望值也会增加

这样想吧:你永远不会看到无限的利润,因为最终硬币投错了方向,你收集了你的奖金。因此,你永远不会得到无限的利润报告你的程序。然而,随着你玩越来越多的游戏,平均值会增加。确实有人说,随着你玩的游戏越来越多,你会越来越接近平均水平,但这并不是说少量的试验就足够了。因为你的期望值是无限的,所以你需要大量的试验才能收敛到无穷大^_^

其他答案指出,您可能溢出了
int
的最大值,这是正确的,但我认为与此无关。您应该切换到使用类似于
double
long
的方法来保存值,但您没有看到无限支付的原因是,您不太可能看到产生极端支付的序列之一


希望这有帮助

我认为这不是问题所在。有关详细信息,请参见我的答案。@模板可能都适用,因为他在乘以赔率之前计算了一个大数字。
int
将结束。这里可以使用BigInteger-如果出现错误,它将抛出
内存…
平均收入随时间对数增长。我做了一些模拟,当我玩了100万场游戏时,每场游戏的收入大约为10英镑。我预计在大约10到100亿场比赛中,收入将达到20%。在玩了2^18场游戏后,我应该已经获得20英镑的收入(即不到100万英镑)。