Java 为什么我的模拟没有找到无限的期望值?
在Youtube视频(从6:09开始)中描述了一个实验,其中一个游戏有无限的期望值 我试图编写一个Java程序来找出一个长期的期望值(平均值)。理论上的期望值是无穷大,但我得到的是一些10左右的数字。是因为我的程序错了吗?因为我认为当实验数量足够大时,实验平均值将非常接近数学期望值。 这是我的节目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
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万英镑)。