Java で捕食者と被食者のシミュレーションを少し書きました。ルールが非常に複雑で混沌としたシステムになったとしても、使用される手法は単純です。
- 基本的なデータ型に関する算術演算と決定
- 外部ライブラリなし
- 外部システムは含まれていません
- 同時実行は発生しません
- 現在の時刻または日付を使用しない
したがって、システムを同じパラメーターで初期化すると、同じ結果が出力されるはずだと思ったのですが、そうではなく、なぜだろうかと思います。
それに関するいくつかの考え: 私のアプリケーションはRandom
s を使用しますが、そのテストではそれらをすべて指定された値で初期化するため、私の理解では、実行ごとに同じ出力を同じ順序で作成する必要があります。
私はSet
s を繰り返し処理していますが、 a が繰り返される順序Set
が定義されていないことを知っています。Set
しかし、同じ順序で同じ値が入力された a が、複数の実行で異なる動作をする理由はわかりません。そうですか?
Sをたくさん使っていfloat
ます。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になります。