다중 스트림
다중 독립 스트림 사용하기
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
속성은 사용자가 만드는 각 스트림의 인덱스를 반환합니다.
streamNum = 256; streamId = 4; s4 = RandStream.create('mlfg6331_64','NumStreams',streamNum,'StreamIndices',streamId)
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
메르센 트위스터의 상태공간은 가능한 시드값 수()보다 훨씬 크므로( 요소) 서로 다른 시드값을 사용하는 두 개의 스트림은 상관관계가 없는 것으로 나타날 수 있습니다. 매우 많고 다양한 시드값을 사용하지 않는 한 다른 시뮬레이션 실행 시 중첩이 발생할 가능성은 거의 없습니다. 간격이 넓은 시드값을 사용하는 것으로는 임의성 수준이 증가하지 않습니다. 사실 이 전략을 극단적으로 사용하여 각 호출 전에 생성기의 시드값을 다시 지정하면 통계적으로 독립적이지 않거나 똑같이 분산되지 않은 값으로 구성된 시퀀스가 만들어질 수 있습니다.
스트림 시드값 지정은 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