Main Content

다중 스트림

다중 독립 스트림 사용하기

MATLAB®에는 다중 독립 난수 스트림을 만들 수 있는 생성기 알고리즘이 포함되어 있습니다. 예를 들어, 다중 독립 스트림을 지원하는 네 가지 생성기 유형은 결합 다중 재귀적('mrg32k3a') 생성기, 시차 피보나치 수열('mlfg6331_64') 생성기, Philox 4x32('philox4x32_10') 생성기, Threefry 4x64('threefry4x64_20') 생성기입니다. 서로 겹치지 않음이 보장되고 스트림 간 값의 (의사) 독립성을 입증하는 테스트가 수행된 다중 독립 스트림을 생성할 수 있습니다. 다중 스트림을 지원하는 생성기 알고리즘에 대한 자세한 내용은 난수 스트림을 만들고 제어하기의 생성기 알고리즘 표를 참조하십시오.

RandStream.create 함수를 사용하면 동일한 생성기 알고리즘과 시드값을 가지지만 통계적으로 독립적인 스트림을 만들 수 있습니다.

[s1,s2,s3] = RandStream.create('mlfg6331_64','NumStreams',3)
s1 = 
mlfg6331_64 random stream
      StreamIndex: 1
       NumStreams: 3
             Seed: 0
  NormalTransform: Ziggurat
s2 = 
mlfg6331_64 random stream
      StreamIndex: 2
       NumStreams: 3
             Seed: 0
  NormalTransform: Ziggurat
s3 = 
mlfg6331_64 random stream
      StreamIndex: 3
       NumStreams: 3
             Seed: 0
  NormalTransform: Ziggurat

독립성을 나타내는 증거로, 이러한 스트림이 대체로 상관 관계가 없음을 확인할 수 있습니다.

r1 = rand(s1,100000,1);
r2 = rand(s2,100000,1); 
r3 = rand(s3,100000,1);
corrcoef([r1,r2,r3])
ans = 3×3

    1.0000    0.0007    0.0052
    0.0007    1.0000    0.0000
    0.0052    0.0000    1.0000

응용 사례에 따라 일부 이벤트를 시뮬레이션해야 하는 경우 일련의 독립 스트림 중에서 몇 개의 스트림만 만드는 것이 유용할 수 있습니다. StreamIndices 파라미터를 지정하여 일련의 다중 스트림 중에서 몇 개의 스트림만 만듭니다. StreamIndex 속성은 사용자가 만드는 각 스트림의 인덱스를 반환합니다.

numLabs = 256;
labIndex = 4;
s4 = RandStream.create('mlfg6331_64','NumStreams',numLabs,'StreamIndices',labIndex)
s4 = 
mlfg6331_64 random stream
      StreamIndex: 4
       NumStreams: 256
             Seed: 0
  NormalTransform: Ziggurat

다중 스트림은 통계적으로 독립적이므로 시뮬레이션의 정밀도를 확인하는 데 사용할 수 있습니다. 예를 들어, 일련의 독립 스트림을 사용하여 여러 다른 MATLAB 세션이나 다른 프로세서에서 몬테 카를로 시뮬레이션을 여러 번 반복하고 결과가 어떻게 달라지는지 확인할 수 있습니다. 따라서 다중 스트림은 대규모 병렬 시뮬레이션에서 유용합니다.

시드값을 사용하여 다른 결과 얻기

독립 스트림을 명시적으로 지원하지 않는 생성기 유형의 경우, 각기 다른 시드값을 사용하여 다중 스트림을 만들 수 있습니다. 서로 다른 시드값을 사용하여, 각기 다른 값을 반환하고 각각 개별적으로 동작하는 스트림을 만들 수 있습니다. 하지만 다중 독립 스트림에 대해 특별히 설계된 생성기를 사용하는 것이 보다 효과적인데, 스트림 전체에 대한 통계적 특성이 신중히 검증되었기 때문입니다.

메르센 트위스터(Mersenne Twister) 생성기를 사용하여 시드값이 다른 두 개의 스트림을 만듭니다.

s1 = RandStream('mt19937ar','Seed',1)
s1 = 
mt19937ar random stream
             Seed: 1
  NormalTransform: Ziggurat
s2 = RandStream('mt19937ar','Seed',2)
s2 = 
mt19937ar random stream
             Seed: 2
  NormalTransform: Ziggurat

하나의 MATLAB 세션에서 첫 번째 스트림을 사용하여 난수를 생성합니다.

r1 = rand(s1,100000,1);

다른 MATLAB 세션에서 두 번째 스트림을 사용하여 난수를 생성합니다.

r2 = rand(s2,100000,1);

각기 다른 시드값을 사용하는 경우 스트림은 일반적으로 상관 관계가 없는 값을 반환합니다.

corrcoef([r1,r2])
ans = 2×2

    1.0000    0.0030
    0.0030    1.0000

메르센 트위스터의 상태공간은 가능한 시드값 수(232)보다 훨씬 크므로(219937 요소) 서로 다른 시드값을 사용하는 두 개의 스트림은 상관관계가 없는 것으로 나타날 수 있습니다. 매우 많고 다양한 시드값을 사용하지 않는 한 다른 시뮬레이션 실행 시 중첩이 발생할 가능성은 거의 없습니다. 간격이 넓은 시드값을 사용하는 것으로는 임의성 수준이 증가하지 않습니다. 사실 이 전략을 극단적으로 사용하여 각 호출 전에 생성기의 시드값을 다시 지정하면 통계적으로 독립적이지 않거나 똑같이 분산되지 않은 값으로 구성된 시퀀스가 만들어질 수 있습니다.

스트림 시드값 지정은 MATLAB 시작 시 또는 시뮬레이션 실행 전에 초기화 단계로 사용할 경우에 가장 유용합니다.

서브스트림을 사용하여 다른 결과 얻기

스트림에서 다른 결과를 얻기 위한 또 하나의 방법은 서브스트림을 사용하는 것입니다. 난수열에서의 위치를 정확하게 알 수 없는 시드값과 달리 서브스트림 간 간격은 알 수 있으므로 중첩을 방지할 수 있습니다. 독립 병렬 스트림과 마찬가지로 서브스트림에 대해 통계적 독립성을 입증하기 위한 연구가 진행되었습니다. 간단히 말해서 서브스트림은 기존에 시드값을 사용해서 했던 일을 더 세심히 조정된 방식으로 하기 위한 방법이며 병렬 스트림보다 더 간단한 솔루션입니다.

서브스트림은 동일한 코드에서 다른 시간에 다른 결과를 얻을 수 있는 빠르고 쉬운 방법을 제공합니다. 예를 들어, 루프에서 여러 개의 난수를 생성해 보겠습니다.

defaultStream = RandStream('mlfg6331_64');
RandStream.setGlobalStream(defaultStream)
for i = 1:5
    defaultStream.Substream = i;
    z = rand(1,i)
end
z = 0.6986
z = 1×2

    0.9230    0.2489

z = 1×3

    0.0261    0.2530    0.0737

z = 1×4

    0.3220    0.7405    0.1983    0.1052

z = 1×5

    0.2067    0.2417    0.9777    0.5970    0.4187

다른 루프에서 첫 번째 5회 반복 세트와 독립적인 난수 값을 생성할 수 있습니다.

for i = 6:10
    defaultStream.Substream = i;
    z = rand(1,11-i)
end
z = 1×5

    0.2650    0.8229    0.2479    0.0247    0.4581

z = 1×4

    0.3963    0.7445    0.7734    0.9113

z = 1×3

    0.2758    0.3662    0.7979

z = 1×2

    0.6814    0.5150

z = 0.5247

이러한 각각의 서브스트림은 자신의 루프 반복을 다시 생성해 낼 수 있습니다. 예를 들어, 루프에서 6번째 서브스트림으로 돌아갈 수 있습니다.

defaultStream.Substream = 6;
z = rand(1,5)
z = 1×5

    0.2650    0.8229    0.2479    0.0247    0.4581

참고 항목

|

관련 항목