我用 Java 编写了一个小捕食者-猎物模拟。即使规则非常复杂并最终进入一个混乱的系统,使用的技术也很简单:
- 关于基本数据类型的算术和决策
- 没有外部库
- 不包括外部系统
- 不发生并发
- 不使用当前时间或日期
所以我想当用相同的参数初始化系统时,它应该输出相同的结果,但事实并非如此,我想知道为什么。
对此的一些想法:我的应用程序使用Random
s,但是对于那个测试,我用给定的值初始化它们,所以在我的理解中,它们应该为每次运行以相同的顺序创建相同的输出。
我正在迭代Set
s,并且我知道Set
迭代 a 的顺序没有定义。但是我看不出有任何理由说明以Set
相同顺序填充具有相同值的 a 在多次运行中应该表现不同。可以?
我用了很多float
s。我总是怀疑 1 + 1 = 1.9999999999725 的数据类型,但即使它们的行为对我来说很奇怪,它也应该总是一样奇怪。不是吗?
垃圾收集不是确定性的,但只要我不依赖析构函数,我就应该是安全的。
如上所述,没有并发,也没有数据类型,具体取决于实际使用时间。
我无法在一个简单的示例中重现该行为。但是通过我的代码,我看不到任何不可预测的东西。那么我上面的任何假设都是错误的吗?有什么想法我可能会错过吗?
这是一个验证我的假设的测试:
public static void main(String[] args) {
Random r = new Random(1);
Set<Float> s = new HashSet<Float>();
for (int i = 0; i < 1000000; i++) {
s.add(r.nextFloat());
}
float ret = 1;
int cnt = 0;
for (Float f : s) {
float multiply = 0.3f;
if (cnt++ % 2 == 0) {
multiply = 0.7f;
}
float f2 = (f * multiply);
ret += f2;
}
System.out.println(ret);
}
对我来说,结果总是 242455.25。