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