8

同じシードが与えられた場合、numpy の乱数​​ジェネレーターに Matlab と同じ乱数を生成させる方法はありますか?

Matlabで次のことを試しました:

>> rng(1);
>> randn(2, 2)

ans =

    0.9794   -0.5484
   -0.2656   -0.0963

Numpy を使用した iPython では次のようになります。

In [21]: import numpy as np
In [22]: np.random.seed(1)
In [23]: np.random.randn(2, 2)
Out[23]: 
array([[ 1.624, -0.612],
       [-0.528, -1.073]])

両方の配列の値が異なります。

または、乱数生成を使用する Matlab と Python の同じアルゴリズムの 2 つの実装を比較する良いアイデアを誰かが提案できますか。

ありがとう!

4

4 に答える 4

18

ツイスター/シーディング メソッドの使用についてさらに明確にしたかっただけです。MATLAB と numpy は、このシーディングを使用して同じシーケンスを生成しますが、行列に別の方法で入力します。

MATLABは行列を列に記入しますが、Pythonは行に記入します。したがって、両方で同じ行列を取得するには、転置する必要があります。

MATLAB:

rand('twister', 1337);
A = rand(3,5)
A = 
 Columns 1 through 2
   0.262024675015582   0.459316887214567
   0.158683972154466   0.321000540520167
   0.278126519494360   0.518392820597537
  Columns 3 through 4
   0.261942925565145   0.115274226683149
   0.976085284877434   0.386275068634359
   0.732814552690482   0.628501179539712
  Column 5
   0.125057926335599
   0.983548605143641
   0.443224868645128

パイソン:

import numpy as np
np.random.seed(1337)
A = np.random.random((5,3))
A.T
array([[ 0.26202468,  0.45931689,  0.26194293,  0.11527423,  0.12505793],
       [ 0.15868397,  0.32100054,  0.97608528,  0.38627507,  0.98354861],
       [ 0.27812652,  0.51839282,  0.73281455,  0.62850118,  0.44322487]])
于 2014-05-15T16:48:13.170 に答える
1
  1. 同じ数値がプロセスに供給されるようにする 1 つの方法は、2 つの言語のいずれかで数値を生成し、保存して、他の言語にインポートすることです。これはかなり簡単です。単純なテキスト ファイルに記述できます。

  2. これが不可能または望ましくない場合は、疑似乱数を自分で生成して、数値が同じであることを確認することもできます。これは、実装が簡単なアルゴリズムの非常に単純な例を示すサイトです: Build your own simple random numbers

  3. 自作の乱数発生器の品質が十分でない場合は、1 つの言語で乱数生成関数を作成し、それを別の言語から呼び出すことができます。おそらく最も簡単な方法は、python から matlab を呼び出すことです。

  4. 運が良ければ、設定をいじってみてください。たとえば、seedmatlabs ランダム関数への (古い) 入力を使用してみてください。または、さまざまな種類のジェネレーターを使用してみてください。両方の言語のデフォルトは mersenne twister だと思いますが、この実装が同じでない場合は、おそらくより単純なものです。

于 2013-08-28T11:43:25.123 に答える
0

Python コード内から、シードに基づいて乱数を取得するために matlab スクリプトを実行するのはどうですか?

于 2013-08-28T11:20:01.487 に答える