3

在 Youtube 视频Numberphile Infinity(从 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);
    }
}
4

3 回答 3

4

int我认为这与数学有关,与s关系不大。

您可能会注意到的一件事是,如果您运行越来越多的试验,预期值会越来越大。期望值是无限的,因为有非常不可能的事件产生非常大的回报。您不太可能发生这种情况,因为获得 2 n利润的概率是 2 -n。例如,这意味着获得 1,000,000 美元(约 2 20美元)的概率约为 2 20分之一. 按照预期,您需要运行 100 万次试验才能看到这种情况发生。因此,如果你只运行 10 万次试验,你就不会期望看到这样的事情发生。但是,随着试验次数的增加,您命中其中一种序列的概率会增加,因此预期值也会增加。

这样想:你永远不会看到无限的利润,因为最终硬币扔错了方向,你会收集到你的奖金。因此,您将永远不会获得程序报告的无限利润。但是,随着您玩的游戏越来越多,平均值会增加。大数定律确实说,当你玩更多游戏时,你会越来越接近平均水平,但它并没有说少量试验就足够了。由于您的期望值是无限的,因此您需要进行大量试验才能收敛到无穷大。^_^

其他答案指出,您可能会溢出 a 的最大值int,这是真的,但我认为在这里无关紧要。您应该切换到使用类似 adoublelong来保存值,但您没有看到无限支付的原因是因为您不太可能看到产生极端支付的序列之一。

希望这可以帮助!

于 2013-10-13T19:30:58.527 回答
1

您正在溢出整数数据类型。它们达到最大值并循环回到最小值。不能像那样做无限方程。

于 2013-10-13T19:27:03.660 回答
0

整数值的范围是 ~ -2 147 000 000 to 2 147 000 000,如果超过整数的最大值,则会溢出到整数的最小值。

于 2013-10-13T19:28:58.737 回答