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

谢谢!

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

Python:

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 回答
3

正如 Bakuriu 建议的那样,它使用 MATLABs twister 工作:

MATLAB:

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

ans =

    0.2620

Python(麻木):

>>> import numpy as np
>>> np.random.seed(1337)
>>> np.random.random()
0.2620246750155817
于 2013-11-25T20:12:34.873 回答
1
  1. 确保向您的流程提供相同数字的一种方法是用两种语言中的一种生成它们,保存它们并导入另一种语言。这相当容易,您可以将它们写在一个简单的文本文件中。

  2. 如果这是不可能或不可取的,您还可以通过自己生成伪随机数来确保数字相同。这是一个网站,展示了一个易于实现的算法的非常简单的示例:构建您自己的简单随机数

  3. 如果你自制的随机生成器质量不够,你可以用一种语言构建一个随机生成函数,然后从另一种语言调用。最简单的方法可能是从 python 调用 matlab。

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

于 2013-08-28T11:43:25.123 回答
0

运行一个 matlab 脚本来从你的 python 代码中获取基于种子的随机数怎么样?

于 2013-08-28T11:20:01.487 回答