0

フック (Detours など) を使用して、任意のアプリケーションで非決定性を取り除くことができるかどうか疑問に思っていました。

シングル スレッド アプリケーションを想定できます (競合とスケジューリングによって引き起こされる非決定論を無視するため)。

rand()私の最初の推測は、シードに関係なく、疑似乱数を要求する関数に対して予測可能で再現可能な出力を得るためにオーバーライドすることでした。

オーバーライドを検討する必要がある、よく使用される他の関数はありますか?

ここに完璧な解決策がないことはわかっていますが、ほとんどのアプリケーションで機能するものでおそらく解決できます。また、この問題を解決する別の方法があれば、それについて読むことに興味があります。

4

1 に答える 1

1

rand()およびフレンドは疑似乱数ジェネレーターであるため、実際に削除する必要はありません。同じシードの場合、 rand() は同じ結果を生成するため、実際にキャッチする必要があるのtime()は、RNG の初期化に使用される呼び出しです。

重要な洞察は、非決定論的な影響は主にスケジューリング (シングル スレッド アプリケーションの大部分には影響しない)、システム コール、およびプログラム内の初期化されていないメモリの結果として発生するということです。プログラムの入力を制御するには、システム コールの結果を制御する必要があります。straceどの関数呼び出しをオーバーライドする必要があるかを判断するための非常に優れたツールです。初期化されていないメモリが使用されているかどうかを確認するには、 を使用しますvalgrind

于 2011-11-10T08:45:32.700 に答える