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