比较使用随机数生成的Matlab和Numpy代码

时间:2013-08-28 11:10:27

标签: python matlab random

有没有办法让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中相同算法的两个实现。

谢谢!

4 个答案:

答案 0 :(得分:11)

只是想进一步澄清使用twister / seeding方法: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]])

答案 1 :(得分:3)

正如Bakuriu建议使用MATLABs twister:

MATLAB:

>> rand('twister', 1337)
>> rand()

ans =

    0.2620

Python(Numpy):

>>> import numpy as np
>>> np.random.seed(1337)
>>> np.random.random()
0.2620246750155817

答案 2 :(得分:0)

如何在你的python代码中运行一个matlab脚本来获取基于种子的随机数?

答案 3 :(得分:0)

  1. 确保为您的流程提供相同数字的一种方法是以两种语言之一生成它们,保存它们并导入到另一种语言中。这很简单,您可以在简单的文本文件中编写它们。

  2. 如果这不可能或不可取,您还可以通过自己生成伪随机数来确保数字相同。这是一个网站,它显示了一个易于实现的算法的简单示例:Build your own simple random numbers

  3. 如果您自制的随机生成器的质量不够,您可以使用一种语言构建随机生成函数,并从另一种语言调用它。最简单的路径可能是从python调用matlab。

  4. 如果您感觉幸运,请尝试使用这些设置。例如,尝试使用(过时的)seed输入来matlabs随机函数。或尝试使用不同种类的发电机。我相信两种语言中的默认值都是mersenne twister,但如果这个实现不一样,也许更简单一个。