如何从PRNG为T独立的实验运行生成时间序列?每个T的种子会不同吗? rand()或randn()将生成随机数,但如果初始条件相同或种子是固定的,则它变为确定性或伪随机。
有人可以说明如何生成PRNG吗? randn(seed)
seed = randn()
生成PRNG的地方{{1}}
答案 0 :(得分:1)
通常有几种方法可用于生成伪随机变量的T独立运行。首先要注意的是,对于给定的种子值,由rand
(或randn
等)产生的每个变量彼此独立,即它们是independent and identically distributed (i.i.d.)。这意味着在许多情况下,您可以通过rng
设置随机数生成器的种子一次,然后代码将在每次运行时生成可重复的伪随机值:
<强> 1 强>
生成N个均匀分布值的T独立运行 - 每次运行时,只要在开头使用相同的参数调用rng
,就会以相同的顺序生成相同的随机值:
rng(1); % Set seed to 1, calls to rand, randn are now based on this seed
N = 100;
T = 10;
for i = 1:T
r = rand(N,1);
% Do something with r
end
<强> 2 强>
一次分配所有随机变量更快。以下r
的列与上面r
循环中的每个for
相同:
rng(1);
N = 100;
T = 10;
r = rand(N,T);
for i = 1:T
% Do something with r(:,i)
end
第3 强>
有时您希望能够重现任意运行而无需模拟所有T。实现此目的的一种方法是为每次运行增加rng
的种子值。 r
中的值将与上述两种情况中的值不同。另外,请注意重置种子是一项昂贵的操作,因此这样做会使代码速度变慢(事实上,您应该尽可能避免重置种子):
N = 100;
T = 10;
for i = 1:T
rng(i);
r = rand(N,1);
% Do something with r
end
<强> 4 强> 有时我们可能希望在多个CPU上模拟T运行并在每个CPU上并行生成随机变量。有关您可能会执行此操作的详细信息,请参阅my answer here。在一个CPU上生成所有变量然后在每个并行进程中共享结果数组的相应部分可能更简单,更健壮。 Distributed arrays 可以为此提供便利。
Matlab中的documentation for random number generation非常广泛,并且有许多高级功能。我建议阅读更多并尝试一些例子。 This video也可能有所帮助。