2015-10-14 125 views
1

我想生成一个有一些错误的矩阵,但它应该是不同的每一个trail.But在我的情况下,我得到完全相同的矩阵与每个trail.My代码是错误的 -使用错误生成随机矩阵

N=50; 
R=50; 
TrialNum=100; 
Error,Pe=0.05; 

A(1:N,1:N) = eye(N); 

seed=6; 
rng(seed,'twister'); 
B = round((rand(R,N))); 

C=[A;B]; 

for t=1 : TrialNum 
    Rp = C ; 
    for i=1:(N+R) 
     if(rand < Pe) 
      Rp(i,:) = 0; 
     end 
    end 
end 

从这段代码中,我每次得到A作为对角矩阵,而B将使用带有种子的随机数生成矩阵。 C是总共100×50矩阵。该矩阵将进入下一个循环,并且由于Pe,每个轨迹不同数目的分组将丢失。

C矩阵将是相同的所有轨迹,但每个审判Rp矩阵将是不同的,但我在每个轨迹上获得完全相同的Rp矩阵。

对于示例 -

trial=1, N=3, R=2 
Rp=1 0 0 
    0 1 0 
    0 0 0 
    1 0 1 
    0 1 1 

trial=2, N=3, R=2 
Rp=1 0 0 
    0 0 0 
    0 0 1 
    1 0 1 
    0 0 0 

需要一些专家comment.Any帮助将不胜感激。

回答

1

问题是,由于每次使用相同的种子,每次运行程序时,Matlab的随机数生成器都会生成相同的随机数实现。

而不是使用RNG了种子,你不应该使用的种子,并要求随后兰特功能来生成随机矩阵,并在循环的随机数之前调用

rng('shuffle') 

一次。

换句话说修改代码以

rng('shuffle') 
B = round((rand(R,N))); 

    C=[A;B]; 

    for t=1 : TrialNum 
     Rp = C ; 
     for i=1:(N+R) 
      if(rand < Pe) 
       Rp(i,:) = 0; 
      end 
     end 
    end 

您将获得随机数的不同实现为您的MATLAB程序的不同运行,因为种子将被基于MATLAB系统时钟如果使用随机播放设置。现在

,如果你想矩阵B是重复的,但在循环中的随机数是不同的,你可以做

seed=6; 
rng(seed,'twister'); 
B = round((rand(R,N))); 

C=[A;B]; 

其次

rng('shuffle') 
for t=1 : TrialNum 
    Rp = C ; 
    for i=1:(N+R) 
     if(rand < Pe) 
     Rp(i,:) = 0; 
     end 
    end 
end 
+0

paisanco感谢您的答案,但我想用种子来控制我的随机数。我不想为第二个循环控制rand,而是我希望B矩阵始终保持不变,但Rp会不同。 –

+0

在这种情况下,您应该可以像以前一样使用种子进行调用,同时生成B矩阵,然后在运行之后让您的Rp不同之后再调用rng('shuffle')。 – paisanco

+0

非常感谢你paisanco .. –