0

そのため、srand() によって生成された数値に基づいて結果を計算する C コードがいくつかあります。同じシード番号を使用すると、結果は常に同じになります。

これで、JNI 経由でこれらの C コードを Android アプリにロードできるようになりました。ただし、同じシード番号を使用しても結果は異なります。シード番号が同じであることを再確認しました。しかし、Android プログラムとネイティブ コードはどちらもかなり複雑であるため、この問題の原因を突き止めるのに苦労しています。

私が確信しているのは、乱数を生成するために Java プログラムで関数を使用していないことです。したがって、おそらく srand() は毎回異なるシード番号で呼び出されるわけではありません。Java または C の他の関数は、srand() によって生成された乱数を変更できますか?

ありがとう!

更新: 私の質問は少し混乱したと思います。明確にするために、比較している結果は同じプラットフォームからのものですが、異なる実行です。C コードは rand() を使用して数値を取得し、それに基づいて結果を計算します。したがって、srand() のシード番号が常に同じである場合、rand() によって取得される数は同じである必要があり、したがって結果も同じになるはずです。しかし、どういうわけか、srand() に同じシードを使用しても、rand() は別の番号を与えてくれます...それについて何か考えはありますか?

4

2 に答える 2

2

乱数ジェネレーターにはさまざまな種類があり、プラットフォームごとにすべてが同じであるとは限りません。プロジェクトでクロス プラットフォームの 100% 予測可能なソリューションが必要な場合は、おそらく独自のソリューションを作成する必要があります。

それは聞こえるかもしれないほど悪くはありません...

Mersenne Twisterアルゴリズム (私のプロジェクトで使用しているもの)などの乱数生成を調べ、すべてのプロジェクトで共有できる小さなコード ブロックを作成することをお勧めします。これにより、さまざまなシードを持つ複数のジェネレーターを使用できるという利点も得られます。これは、特定のシードに基づいて予測可能なランダムなセットでパズルを生成する必要があるパズルゲームのようなものに非常に役立ちますが、別のクロックが必要になる場合があります。特別な FX やその他のゲーム要素をランダム化するためのシード付きジェネレーター。

于 2013-08-08T02:10:20.603 に答える
0

rand() によって実装される疑似乱数アルゴリズムは、C ライブラリによって決定され、標準アルゴリズムはありません。ある実装から次の実装まで同じ一連の番号を取得できるとは限りません。また、Android の実装が開発環境と異なるように思えます。プラットフォーム間で予測可能なシーケンスが必要な場合は、独自の乱数ジェネレーターを実装する必要があります。

于 2013-08-08T02:08:32.597 に答える