Matlab中rng()函数在循环中的行为差异及原因咨询
为什么Matlab中rng位置不同,randn结果有差异?
核心原因很直接:rng(1,'philox')每次调用都会把随机数生成器重置到种子1的初始状态,两种场景的执行逻辑完全不一样:
场景1:rng放在循环内
for i = 1:2 rng(1,'philox'); disp(randn(2,1)); % 两次输出都是0.0906, -0.7327 end
每次循环启动时,rng(1,'philox')都会把生成器打回种子1的起始位置,随后调用randn(2,1)都是从这个起始点取序列的前2个随机数。相当于反复读同一段序列,所以两次输出完全重复。
场景2:rng放在循环外
rng(1,'philox'); for i = 1:2 disp(randn(2,1)); % 第一次0.7565,-0.7096;第二次是序列的下两个数 end
只在最开始执行一次rng(1,'philox'),生成器处于起始状态:
- 第一次循环:
randn(2,1)取序列的第1、2个数,生成器状态前进到第3个位置 - 第二次循环:
randn(2,1)接着取序列的第3、4个数,所以输出和第一次不同
你说的“种子1对应相同的随机数序列”没错,但生成器的状态是随随机数调用逐步推进的。循环内的重置操作打断了这个推进过程,强制每次都从头开始取数,这才是结果差异的本质。
如果要验证,直接调用randn(4,1)会得到:
0.7565 -0.7096 [第二次循环的两个数]
和场景2两次循环的输出完全对应,也能证明序列是连续的。
内容的提问来源于stack exchange,提问作者Usingless
相关产品推荐
相关产品推荐

