如何在Python中复现MATLAB randperm函数的相同随机序列?
如何让NumPy生成与MATLAB
randperm完全一致的随机序列 我在Stack Overflow上搜索过类似问题,其中《Replicating MATLAB's randperm in NumPy》这一主题最为相关。不过,尽管可以用NumPy的随机排列函数复刻MATLAB randperm的行为,但即使为两种语言设置相同的随机种子,生成的序列仍不相同——这让我困惑,因为我测试过的其他随机函数在MATLAB和Python间是可以对齐的。
测试内容
MATLAB代码及结果
rng(42); randperm(15)
返回结果:
ans = 11 7 6 5 15 14 1 4 9 10 3 13 8 2 12
Python代码及结果
import numpy as np np.random.seed(42) print(np.random.permutation(range(1,16)))
返回结果:
[10 12 1 14 6 9 3 2 15 5 8 11 13 4 7]
请问如何修改Python代码,使其生成与MATLAB完全一致的随机序列?
解决方案
MATLAB的randperm(n)核心逻辑是先生成n个0到1的均匀随机数,再对这些随机数的索引进行排序得到排列;而NumPy的permutation是直接对输入序列做随机打乱,两者底层实现逻辑不同,所以同种子下结果无法对齐。要得到一致序列,需要复刻MATLAB的randperm实现逻辑:
修改后的Python代码
import numpy as np def matlab_randperm(n, seed=None): # 初始化与MATLAB兼容的随机数生成器(默认Mersenne Twister算法) rng = np.random.RandomState(seed) if seed is not None else np.random.RandomState() # 生成对应MATLAB rand(n,1)的随机数数组 rand_vals = rng.rand(n) # 对随机数排序取索引,再加1转换为MATLAB的1-based索引 perm = np.argsort(rand_vals) + 1 return perm # 测试 print(matlab_randperm(15, seed=42))
输出结果
[11 7 6 5 15 14 1 4 9 10 3 13 8 2 12]
该函数完全对齐MATLAB randperm的执行逻辑,同时使用同类型的随机数生成器,设置相同种子后即可得到与MATLAB完全一致的排列结果。
内容的提问来源于stack exchange,提问作者Paul Ledesma
相关产品推荐
相关产品推荐

