私はAIコンテストのホストをやっていて、ランダムな可能な値を選択するrandomBotを持っています。
ボットには、Init(_seed) と MakeMove() の 2 つのエクスポート関数があります。
まったく同じゲームをプレイするには、ホストが各ボットに対して定義されたシード値を持っています。Init 関数でそれを渡します。
random bot の Init 関数には srand(_seed) 関数呼び出しがあります。ランダムボットの MakeMove 関数には、rand() 関数呼び出しがあります。
ここでの問題は、2 つのボットをロードした後、各ゲームは同じシード値で同じになるはずですが、それらは異なるということです。
私が知っているように、srand はモジュール/スレッドごとに値を保存し、共有しないでください。
テストを行い、それぞれ srand と rand の呼び出しでエクスポートされない関数 mysrand と myrand を作成しました。
エクスポートされた関数内の srand と rand を mysrand と myrand に置き換えました...そしてうまくいきました...
なぜこうなったのかは分かっているのですが、よくわかりません...
なぜ正確にそれが起こるのか、それを回避する方法は、競技者にエクスポートされた関数内で必要な関数を使用してもらいたいからです (プロキシ関数を使用したくない)。
ありがとう。
Windows、コンパイラを使用しています: gcc、ビジュアル C++、ボーランド C++ ビルダー