随机数种子重叠问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随机数种子重叠问题相关的知识,希望对你有一定的参考价值。

我正在使用Matlab GPU计算来运行仿真。我怀疑我可能会遇到“随机数种子”重叠的问题。我的代码如下

N = 10000;
v = rand(N,1);
p = [0:0.1:1];
pA = [0:0.1:2];
[v,p,pA] = ndgrid(v,p,pA);
v = gpuArray(v);
p = gpuArray(p);
pA = gpuArray(pA);
t = 1;
bH = 0.9;
bL = 0.6;
a = 0.5;

Y = MyFunction(v,p,pA,t,bH,bL,a);

function[RA] = MyFunction(v,p,pA,t,bH,bL,a)
function[RA] = SSP1(v,p,pA)
RA = 0;
S1 = rand;
S2 = rand;
S3 = rand;
vA1 = (S1<a)*bH+(S1>=a)*bL;
vA2 = (S2<a)*bH+(S2>=a)*bL;
vA3 = (S3<a)*bH+(S3>=a)*bL;

if p<=t && pA>3*bL && pA<=3*bH 
   if pA>vA1+vA2+vA3
      if v>=p
         RA = p;
      end
   else
      if v+vA1+vA2+vA3>=p+pA
         RA = p+pA;
      end
   end
end
end
[RA] = gather(arrayfun(@SSP1,v,p,pA));
end

代码的想法如下:

我生成N个随机代理,其特征是v的值。然后,对于每个代理,我必须计算给定的数量(p,pA)。由于我有N个代理和(p,pA)的许多组合,因此我想使用GPU来加快处理速度。 但是这是一件棘手的事情:

对于每个代理,为了完成我的计算,我必须生成3个额外的随机变量vA1,vA2,vA3。根据我对GPU的理解(可能是错误的),它会同时执行这些计算,即,对于每个代理v,它会生成3个随机变量vA1,vA2,vA3。 GPU同时执行此N程序。但是,我不确定代理1和代理2是否对应的vA1,vA2,vA3可以重叠?因为这里N可能是一百万。我要确保对于所有这些代理,用于生成其对应的vA1,vA2,vA3的随机数种子都不会重叠;否则,我很麻烦。

有一种防止这种情况发生的方法,这是:我首先生成这些随机变量3NvA1,vA2,vA3。然后,将它们放入我的GPU中。但是,这可能需要很多GPU内存,而我没有。我想当前的方法不需要太多的GPU内存,因为我正在动态生成vA1,vA2,vA3

答案

您说的话不会发生。证明是,以下代码片段在hB中生成随机值。

A=ones(100,1);

dA=gpuArray(A);

[hB] = gather(arrayfun(@applyrand,dA));
function dB=applyrand(dA)
r=rand;
dB=dA*r;
end

也就是说,您的代码的随机变量只有12个值(每个为4个,因为使用S1,S2和S3基本上是在掷硬币:]]

vA1 = (S1<0.5)*bH+(S1>=0.5)*bL;

所以vA1为0,bHbLbH+bL。也许由于缺乏可变性,这使您认为您没有太多的随机性,这个问题也不是很清楚。

以上是关于随机数种子重叠问题的主要内容,如果未能解决你的问题,请参考以下文章

如何修复重叠的片段

导航上的片段生命周期重叠

为每次运行代码设置不同的种子

生成随机种子十六进制颜色?

Random类

具有固定种子和可变精度的 boost::multiprecision 随机数