2017-05-10 28 views
0

我使用HPC運行Matlab作業數組。每個作業執行一個涉及隨機數的循環。每份工作中我都會得到相同的隨機數。我怎樣才能解決這個問題,並獲得每個工作不同的隨機數字?在做數組時,在Matlab中更改隨機數的種子

我發現了一個類似的問題here但我認爲這是一個比我的更復雜的情況:而不是每個作業中的parfor循環,我只有一個for循環。

這裏我的代碼的簡化版本

%%%% main.m %%%%% 
clear all 
n=5; 
K=2; 
H=5; %number of jobs per worker 

%%%% f.m %%%%% 
RVall=zeros(n,K,H); 
for s=1:H 
    RVall(:,:,s) = unifrnd(0,1,n,K); 
end 
filename = sprintf('RVall.%d.mat', ID); 
save(filename, 'RVall') 

的sh文件是

#Example 

#$ -S /bin/bash 
#$ -l h_vmem=4G 
#$ -l tmem=4G 
#$ -l h_rt=360:0:0 
#$ -cwd 
#$ -j y 

#Run 200 tasks where each task has a different $SGE_TASK_ID ranging 
from 1 to 200 
#$ -t 1-200 

#$ -N try 
date 
hostname 

#Output the Task ID 
echo "Task ID is $SGE_TASK_ID" 

matlab -nodisplay -nodesktop -nojvm -nosplash -r "main; ID = $SGE_TASK_ID; f; exit" 

在這個例子中,你會看到RVall.1=RVall.2=...=RVall.200

回答

1

我想答案您參考仍然適用。簡單的解決方法入手將使用rng(ID)種子在不同的種子每次運行隨機數產生,例如:

%%%% main.m %%%%% 
clear all 
n=5; 
K=2; 
H=5; %number of jobs per worker 

%%%% f.m %%%%% 
rng(ID); 
RVall=zeros(n,K,H); 
for s=1:H 
    RVall(:,:,s) = unifrnd(0,1,n,K); 
end 
filename = sprintf('RVall.%d.mat', ID); 
save(filename, 'RVall') 

原因:MATLAB的隨機數生成器被設置爲在啓動時的默認值,即梅森-Twister算法與種子0.除非在每次運行中設置不同的種子,否則隨機數的序列對於所有運行都是相同的。