2017-05-10 8 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の乱数生成器が起動時のデフォルト値に設定されている、つまりメルセンヌ - シード0の乱数アルゴリズム乱数のシーケンスは、実行ごとに異なるシードを設定しない限り、すべての実行で同じになります。

関連する問題