2013-06-18 4 views
2

Matlab에서 여러 PBS 작업 (나는 작업 배열을 사용하고 있습니다)간에 다른 난수를 만들려고합니다. 나는 그것을 계량 할 수없는 - 내 결과를 그릴 때, 나는 다른 작업의 결과가 완전히 무작위없는 것을 볼 그러나다른 PBS 작업을 통해 무작위로 시드

parfor k = 1:10  
    tmp = randi(100, [1 200]); 
end 

: 각각의 MATLAB 작업은 다음과 같이 병렬 parfor의 난수를 생성하는 루프, 뭔가를 사용 예를 들어 숫자가 정확히 같다고 말하면 내 결과는 임의의 숫자의 함수이기 때문에 그것을 그리는 것은 틀림 없습니다. 나는 프로세스 ID 및/또는 클럭 사용하여 각 작업에서 임의의 씨앗을 초기화하려고 :

rngSeed = feature('getpid'); % OR: rngSeed = RandStream.shuffleSeed; 
rng(rngSeed); 

을하지만이 문제가 해결되지 않았다. ShuffleSeed (클럭 기반)를 사용하기 전에 각 작업마다 다른 초 수를 사용하여 일시 중지를 시도했습니다.

이 모든 것이 parfor가 임의적으로 시드를 혼란스럽게한다고 생각하게 만들었습니다. 그리고 parfor가 parfor의 다른 반복을 가로 질러 다른 난수를 얻는 지 확인해야 할 필요가 있습니다.

내 질문이 정말 그렇습니다. 어떻게 해결하고 다른 PBS 작업에서 임의성을 얻을 수 있습니까?

EDIT 각각 2 개의 작업자와 함께 parfor를 사용하는 각 작업에는 각자 자신의 시드 (parfor 외부에서 설정 됨)가 있지만 생성 된 숫자는 작업 전체에서 동일하다는 것을 확인했습니다 (parfor - 그 Matlab에 의해 처리됩니다).

편집 2이 @Sam 로버츠에 의해 무엇을 제안했다려고, 나는 다음과 같은 코드를 사용합니다

matlabpool open local 2 
st = RandStream('mlfg6331_64'); 
RandStream.setGlobalStream(st); 
rng('shuffle'); 

parfor n = 1:4  
    x=randi(100,[1 10]); 
    fprintf('%d ',x(:)'); 
    fprintf('\n') 
end 
matlabpool close 

을하지만, 난 여전히 위의 스크립트로 다른 통화에 같은 번호를 얻을.

답변

1

랜덤 서브 스트림을 사용하여 병렬로 실행하면 올바른 랜덤 성과 재현성을 얻을 수 있습니다.

RandStream 클래스를 사용하면 의사 스트림 번호 스트림을 만들 수 있습니다.이 스트림에서 가져온 숫자는 원하는 속성 (독립성 등)을 가지며 시드를 제어하는 ​​경우 재현성도 있습니다.

그러나 스트림에서 가져온 매 두 번째 또는 네 번째 숫자가 동일한 속성을 갖는 경우는 아닐 수도 있습니다. 또한 parfor을 사용하면 루프 반복이 실행되는 순서를 제어 할 수 없으므로 재현성을 잃을 수 있습니다. parfor 루프 내에서 각 작업자마다 다른 하위 스트림을 사용할 수 있습니다. 동일한 의사 랜덤 특성을 보유 할 수 독립적 같은 RNG에 의해 생성 된 스트림이지만 -

일부 된 RNG는 예 mlfg6331_64 들어 곱셈 피보나치 발생기 또는 mrg32k3a, 결합 다중 재귀 발생기 지원 서브 뒤쳐 별도로 선택하여 재현성을 유지하십시오. 또한 많은 MATLAB 및 Toolbox 함수에는 'UseParallel''UseSubstreams' 옵션이있어 자동으로이 작업을 수행하도록 지시합니다.

위 내용은 MATLAB 문서의 기술 수준에서 설명하고 있지만 찾기가 어렵습니다.Statistics Toolbox 설명서에는 훨씬 더 많은 설명이 포함되어 있습니다 (실제로 나에게 묻는다면 MATLAB로 옮겨야합니다). 온라인으로 here을 읽을 수 있습니다.

희망 하시겠습니까?

+0

여기에 몇 가지 블로그 기사가 있습니다. http://blogs.mathworks.com/loren/2008/11/05/new-ways-with-random-numbers-part-i/ 및 http : // blogs .mathworks.com/loren/2008/11/13/new-ways-with-random-numbers-part-ii/몇 가지 추가적인 통찰력을 제공합니다. 또한 Peter Perkins의 말을 인용하면 다음과 같이 말합니다. "작업(또는 하위 스트림) 색인을 작업, 작업자 또는 실행에 기초하여 동일한 난수를 다시 사용하지 않도록 을 보장 할 수 있습니다." – Edric

+0

그래서, 기본적으로 당신은 내가 parfor 내부에있는 seed 자신을 처리 할 것을 제안합니다. parfor가 병렬 속성을 처리하도록하지는 않습니까? 나는 당신의 제안을 이해할 수 있도록 요구하고 있습니다. –

+0

No - 서브 스트림을 지원하는 위의 생성자 중 하나를 사용하여 클라이언트에서 하나의'RandStream'을 만듭니다. 's'라고 부르세요. 원하는 경우's'의 시드를 클라이언트에 한 번 설정하십시오. 그런 다음 'parfor'내에서 MATLAB은 각 반복에 인덱스를 제공하고이를 사용하여 난수를 생성하기위한 다른 서브 스트림을 선택합니다. –