在做作业数组时,在Matlab中更改随机数的种子

时间:2017-05-10 16:10:59

标签: matlab

我正在使用HPC运行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 个答案:

答案 0 :(得分: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的Mersenne-Twister算法。除非您在每次运行中设置不同的种子,否则随机数的序列对于所有运行都是相同的。