【问题标题】:Change seed for random numbers in Matlab when doing job array做作业数组时在 Matlab 中更改随机数的种子
【发布时间】:2017-05-11 00:18:17
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: matlab


    【解决方案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 算法。除非您在每次运行中设置不同的种子,否则所有运行的随机数序列都是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-25
      • 2022-06-10
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2014-05-29
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多