【问题标题】:How do I reproduce the same random integer array in matlab and python?如何在 matlab 和 python 中重现相同的随机整数数组?
【发布时间】:2022-01-06 10:38:51
【问题描述】:

如何在 Python 和 Matlab 中获得相同的随机数?

例如,我的 Matlab 代码使用给定的种子打印随机整数 1 和 2:

>> rng(1);
>> randi(2,1,10)

ans =
    
         1     2     1     1     1     1     1     1     1     2

但是,当我使用 NumPy 获得相同的种子时,我会得到不同顺序的随机数:

np.random.seed(1)

np.random.randint(1,3,10)

array([2, 2, 1, 1, 2, 2, 2, 2, 2, 1])

这两种方法有什么办法可以产生相同顺序的随机数吗?

【问题讨论】:

  • 种子点它启动 given 随机数生成器,而不是为 any 生成器提供可预测的结果;)简而言之,恐怕你不能
  • 你需要找出matlab使用的生成器,然后在python/numpy中找到一个等效的生成器。
  • 或者您可以使用两种语言中的一种生成数组并将其导出到另一种。
  • 如果你想要相同的随机数......那么你根本不想要一个随机数......你想要一些序列,你可以预定义

标签: python numpy matlab


【解决方案1】:

正如this answer 中所见,可以在 MATLAB 和 Python/NumPy 中生成相同的均匀分布数字的随机流。两者都使用相同的 MT19937 Mersenne Twister:

>> format long
>> rng(1)
>> rand(1,3)
ans =
   0.417022004702574   0.720324493442158   0.000114374817345
>>> import numpy as np
>>> np.random.seed(1)
>>> np.random.rand(1,3)
array([[4.17022005e-01, 7.20324493e-01, 1.14374817e-04]])

所以我们在这里看到的区别在于这些数字如何转换为给定范围内的整数。但幸运的是,这是一个简单的步骤,我们可以在两种语言中完全相同地实现:

rng(1)
upper = 2;
lower = 1;
v = floor((rand(1,10) * (upper-lower+1)) + lower);
np.random.seed(1)
upper = 2;
lower = 1;
v = np.floor((np.random.rand(1,10) * (upper-lower+1)) + lower).astype(np.int64)

请注意,这不是产生给定范围内整数的最佳方法,这种方法是有偏差的,因为输入的随机数只能获得一组离散值,而这些离散值不一定均匀分布在输出离散值。当然,影响非常小,可能对您的应用程序并不重要。有关这方面的更多详细信息以及正确(但更复杂)的算法,请参阅this anser。

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 2018-04-16
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多