あなたはすでに多くの正しい観察をしました!
両方のランダムジェネレーターをシードする場合を除いて、長期的にはどちらか一方のジェネレーターを選択する方が簡単です。ただし、両方を使用する必要がある場合は、はい、両方をシードする必要があります。これは、これらが互いに独立して乱数を生成するためです。
の場合numpy.random.seed()
、主な問題は、スレッドセーフではないことです。つまり、2つの異なるスレッドが同時に関数を実行している場合は動作が保証されないため、実行スレッドが多数ある場合は安全に使用できません。スレッドを使用しておらず、将来このようにプログラムを書き直す必要がないと合理的に予想できる場合は、numpy.random.seed()
問題ないはずです。将来スレッドが必要になる可能性があると疑う理由がある場合は、長期的には、提案どおりに実行し、クラスのローカルインスタンスを作成するnumpy.random.Random
方がはるかに安全です。私が知る限り、random.random.seed()
スレッドセーフです(または、少なくとも、反対の証拠は見つかりませんでした)。
numpy.random
ライブラリには、科学研究で一般的に使用されるいくつかの追加の確率分布と、ランダムデータの配列を生成するための便利な関数がいくつか含まれています。random.random
ライブラリはもう少し軽量であり、科学的な研究や統計に関する他の種類の作業を行っていない場合は問題ないはずです。
それ以外の場合は、どちらもメルセンヌツイスターシーケンスを使用して乱数を生成します。どちらも完全に決定論的です。つまり、いくつかの重要な情報を知っていれば、次に来る数字を絶対的に確実に予測できます。このため、numpy.randomもrandom.randomも、深刻な暗号化の使用には適していません。ただし、シーケンスが非常に長いため、データをリバースエンジニアリングしようとする人のことを心配していない場合は、どちらも乱数を生成するのに適しています。これは、乱数をシードする必要がある理由でもあります。毎回同じ場所から開始すると、常に同じ乱数のシーケンスが得られます。
ちなみに、暗号化レベルのランダム性が必要な場合は、シークレットモジュールを使用する必要があります。また、Python 3.6より前のバージョンのPythonを使用している場合は、Crypto.Randomなどを使用する必要があります。