运行方式不同时随机输出不同

时间:2015-11-23 10:29:25

标签: java probability

我正在尝试解决问题: - 点位于初始位置X.它可以向左或向右移动。如果它以相同的概率向左或向右移动10次,那么它在初始位置X结束的概率是多少? 我使用了以下java程序: -

import java.util.Random;

public class ProbMain {

int left;
int right;
int error;
double middle;

public ProbMain() {
    left = right = error = 0;
    middle = 0.0;
}

void pushLeft() {
    ++left;
}

void pushRight() {
    ++right;
}

void push() {
    int whichWay;
    Random rand = new Random();
    whichWay = rand.nextInt(2);
    if (whichWay == 0)
        pushLeft();
    else if (whichWay == 1)
        pushRight();
    else
        ++error;
}

public static void main(String[] args) {
    ProbMain obj = new ProbMain();
    for (int b = 0; b < 10000; b++) {
        for (int a = 0; a < 10000; a++) {
            for (int i = 0; i < 10; i++)
                obj.push();
            if (obj.left == obj.right)
                ++obj.middle;
            obj.left = obj.right = 0;
        }
    }
    System.out.println("Error: " + obj.error);
    System.out.println("Probability of middle: " + obj.middle / (10000*10000));
}

}

奇怪的是,当我在Eclipse上运行时,我得到0.05左右的结果但是当我从命令行运行时,我得到0.24左右的结果。为什么这样?哪一个是正确的?

1 个答案:

答案 0 :(得分:2)

每次要检索随机数时都会创建一个新的Random对象(在push()方法中) - 这会导致非常差的熵并在程序运行时产生奇怪的结果由于附加的调试器,通常从eclipse运行会慢得多,当RNG初始化为时间值作为种子时,这会产生更好的随机结果。

您应该将程序更改为仅使用一个Random实例,例如声明新的Random成员变量并在ProbMain构造函数中初始化一次。