1. ホーム
  2. python

[解決済み] Pythonのnumpy.randomとrandom.randomの相違点

2022-10-01 06:23:37

質問

Pythonで大きなスクリプトを作っています。私は他の人のコードで自分自身を鼓舞したので、私は最終的に numpy.random モジュールを使うことにしました(たとえば二項分布からとった乱数の配列を作るため)。 random.random .

どなたか、この2つの大きな違いを教えていただけませんか? それぞれのdocのWebページを見てみると、以下のように思えます。 numpy.random の方がメソッドが多いだけのように思えますが、乱数の生成がどう違うのかが不明です。

なぜ私が質問しているかというと、デバッグのためにメインプログラムに種を蒔く必要があるからです。しかし、私がインポートしているすべてのモジュールで同じ乱数生成器を使用しなければ動作しませんが、これは正しいですか?

また、私はここで、別の投稿で、使用しないことについての議論を読みました。 numpy.random.seed() を使用しないという議論を読みましたが、なぜこれがそんなに悪い考えなのかよく分かりませんでした。私は本当に誰かがこれがそうである理由を私に説明する場合、感謝します。

どのように解決するのですか?

あなたはすでに多くの正しい観察をしていますね。

両方のランダム ジェネレータにシードを入れたいのでなければ、長い目で見れば、どちらか一方のジェネレータを選択する方が簡単でしょう。しかし、両方を使用する必要がある場合、乱数は互いに独立して生成されるため、両方にシードを設定する必要があります。

のために numpy.random.seed() の場合、主な問題はスレッドセーフでないことです - つまり、もしあなたが 多くの異なるスレッドが実行されている場合 なぜなら、2つの異なるスレッドが同時にこの関数を実行した場合、動作が保証されないからです。スレッドを使用しておらず、将来的にこの方法でプログラムを書き直す必要がないことが合理的に予想できる場合。 numpy.random.seed() で問題ないでしょう。 将来的にスレッドが必要になると思われる理由がある場合は、 提案されたとおりにした方が長い目で見ればずっと安全です。 のローカルインスタンスを作成します。 numpy.random.Random クラスのローカルインスタンスを作成します。 . 私が知る限りでは random.random.seed() はスレッドセーフです(少なくとも、私はそれに反する証拠を見つけられませんでした)。

numpy.random ライブラリには、科学的研究でよく使われる確率分布と、ランダムなデータの配列を生成するための便利な関数がいくつか含まれています。このライブラリは random.random ライブラリはもう少し軽量で、科学的研究や統計の他の種類の仕事をしないのであれば、問題ないでしょう。

それ以外の場合は、どちらも メルセンヌ・ツイスター数列 を使って乱数を生成していますが、どちらも完全に決定論的です。つまり、いくつかの重要な情報を知っていれば、絶対的な確実性を持って予測することが可能なのです。 どの数字が次に来るか . この理由から、numpy.randomもrandom.randomも、どのような用途にも適していません。 深刻な暗号の使用 . しかし、乱数列はとてもとても長いので、人々があなたのデータをリバースエンジニアリングしようとすることを心配しない場合には、どちらも乱数を生成するのに適しています。これは、乱数値に種を蒔く必要がある理由でもあります。毎回同じ場所から開始すると、常に同じ乱数列が得られます!

余談ですが、もしあなたが を行う で暗号レベルのランダム性が必要な場合は 秘密 モジュールか、あるいは 暗号化.ランダム のようなもので、Python 3.6より前のバージョンを使っている場合は、このモジュールが使われます。