2013-02-14 2 views
5

サードパーティのライブラリには、srand()/rand()コールが広く使用されています。この問題は、同じプロセスで異なるライブラリを組み合わせるときに発生します。適切な通話順序を確保するのが難しい場合もありますが、srand()rand()のコールが混在する可能性があります。もう1つの問題は、アプリケーションレベルでシード値を選択できないことです。一般的な規則として、をライブラリに入れないでください(オープンソースを含む)(アプリケーションにシードする作業は任せていますか?ライブラリでsrand()を使用する際の問題

+3

*または*を使用するように現実のアプリケーションでは、より良いプラクティスです単一のグローバル*シードに依存していません。実際、 'rand()'はひどく壊れていて、ひどく設計されていて、ひどくAPIを実装していません。あなたのライブラリがランダムジェネレータを必要とする場合は、まともなものを使用してください。プロセスのグローバルな状態は乱されません。 – jalf

+0

アプリケーションデザイナのPOVから、オープンソースライブラリのsrand()が私の問題です。セキュリティレベルのランダム性は必要ありません。 –

+3

適切なライブラリがあれば、実際のユーザがsrand()を呼び出す必要があります。 srand()が呼び出されたサードパーティのものを使用する場合は、これが非常に悪い習慣であり、世界をより良い場所にするように教えてください:) –

答えて

0

ライブラリでハードコードされたシードが使用されている場合は、シードになるように「十分にランダム」と宣言するようにシードを変更する必要があります。

また、/ dev/urandのようなプラットフォームを使用している場合は、おそらくそれを使用することができます。また、マルチプラットフォームにする必要がある場合は、OpenSSLの乱数ライブラリなどを使用しないでください。 OpenSSLは、ターゲットとしているすべてのプラットフォームで利用できるはずです。すでにインストールされていることが多いため、リンクするだけで済みます。あなたが言及した理由から

+0

この場合、唯一の方法はサードパーティのライブラリを変更することです。それは新しいバージョンへの容易な移動を複雑にします。 –

+0

@DavidKhosid次に、ライブラリがひどく書かれている場合は、ライブラリを変更しないでください。 – Plecharts

+0

実際には、この設計上の欠陥(objdump)をすべてのサードパーティライブラリで検索し、プロジェクトに取り込むすべてのバージョンのライブラリを変更する必要があります。私はライブラリがsrand()を無条件に呼び出さないほうがいいです。 –

1

、とりわけ、それはdoesnのあなたは、この世紀に設計されたランダムなAPIを使用することができboost::randomまたはC++ 11 randomライブラリ

+0

C++ 11のランダム性は素晴らしいですが、サードパーティのライブラリはsrand()呼び出しでランダム性を管理します。 –

+0

boost :: randomがsrand/randを使用していることを確認するソースが見つかりません。あなたはこの主張への参照を提供できますか? – eladidan

+0

boost :: randomに問題はありません。他の多くのオープンソースライブラリ、例えばZLIBには問題があります。 –

関連する問題