

pythonを使用して乱数を生成したいのですが、調べたところ標準のrandomというモジュールとnumpy.randomを使用する方法があるようなのですが、乱数生成における両者の違いは何でしょうか？


CC BY-SA 4.0
2018-08-24T08:37:32.030
47782
2018-08-25T16:08:19.237
2018-08-25T16:08:19.237
3054
29545
question
python numpy
標準のrandomモジュールとnumpy.randomの違い


こちらの記事によると、大量に乱数を生成して処理を実行する場合にはnumpyのほうが高速であるようです。  
<https://qiita.com/yubais/items/bf9ce0a8fefdcc0b0c97>


CC BY-SA 4.0
2018-08-24T08:43:52.663
47783
2018-08-24T08:43:52.663
29850
47782
answer


こんな記事もあるのでご参考までに  
乱数の発生個数に大きな違いがあるようですね  
<http://python-remrin.hatenadiary.jp/entry/2017/04/26/233717>


CC BY-SA 4.0
2018-08-24T08:53:18.447
47784
2018-08-24T08:53:18.447
29851
47782
answer


Python標準の`random`と`numpy.random`は、どちらも擬似乱数を生成するもので、乱数生成器としてメルセンヌツイスタ（Mersenne
Twister）を使っています。メルセンヌツイスタは、高速に統計的には問題のない疑似乱数を作成することができます。ただし、線形漸化式によって生成されるため予測可能なので、セキュリティ目的で使用する場合は、`secrets`モジュールを使用することが推奨されています。

Python ドキュメント [9.6. random ---
擬似乱数を生成する](https://docs.python.org/ja/3.7/library/random.html)  
Numpy Doc [Random sampling
(numpy.random)](https://docs.scipy.org/doc/numpy-1.14.0/reference/routines.random.html)

標準の`random`も`C`言語で作成されているため処理速度の方も変わりません。NumpyやPandasのように配列を使う場合は、`numpy.random`の方を使ったほうが`np.random.random(1000)`のように乱数の配列が簡単に作成できるので便利だし、配列の処理は高速です。一方、配列を使わない場合には、わざわざ`numpy`をインポートして使う必要もなく標準の`random`を使えばいいと思います。参考までにJupyterでの処理時間を載せておきます。

[code]

    %%timeit
    a = 0
    for i in range(10000):
      a += random.random() 
    
    1000 loops, best of 3: 1.12 ms per loop
    
    %%timeit
    a = 0
    for x in np.random.random(10000):
      a += x
    
    1000 loops, best of 3: 1.12 ms per loop
    
[/code]

なお英語版にはこれと同じような質問 [Differences between numpy.random and random.random in
Python](https://stackoverflow.com/questions/7029993)があり、両者の違いは、`numpy.random.seed()`はスレッドセーフではないが、`random.random.seed()`の方はスレッドセーフであると書かれていますが、Pythonのドキュメントには以下のように書かれているので、`random.random.seed()`も複数のスレッドで使用する場合には注意が必要です。

> 9.6.6. 再現性について¶
>
>
> 疑似乱数生成器から与えられたシーケンスを再現できると便利なことがあります。シード値を再利用することで、複数のスレッドが実行されていない限り、実行ごとに同じシーケンスが再現できます。


CC BY-SA 4.0
2018-08-25T00:17:50.303
47797
2018-08-25T00:30:04.610
2018-08-25T00:30:04.610
15171
15171
47782
answer