Main Content

RandStream

설명

RandStream은 지정된 의사 난수 생성기 알고리즘을 사용하여 난수 스트림을 만듭니다.

MATLAB®에서는 하나 이상의 난수 스트림에서 의사 난수를 생성할 수 있습니다. 난수로 구성된 배열을 생성하는 가장 간단한 방법은 rand, randi, randnrandperm 함수를 사용하는 것입니다. 이러한 함수는 모두 전역 스트림으로 알려진 동일한 균등분포된 난수 스트림에 의존합니다. 전역 스트림을 변경하는 데는 RandStream을 사용할 수 있으나, 반드시 그래야 하는 것은 아닙니다. RandStream을 사용하여 스트림을 만들 경우 RandStream.setGlobalStream을 사용하여 이것을 전역 스트림으로 만들 수 있습니다. 그러나 rng 함수가 대부분의 경우에 사용하기에 충분한 전역 스트림을 더 간단하게 만드는 인터페이스를 제공합니다.

RandStream을 사용하여 스트림을 만들고 rand, randi, randn 또는 randperm을 사용하여 이 스트림에서 난수를 생성할 수 있습니다. 이렇게 생성된 난수는 전역 스트림이나 다른 스트림에서 추출된 것과 독립적입니다. 자세한 내용은 객체 함수 항목을 참조하십시오.

생성

단일 난수 스트림을 만들려면 다음 구문을 사용하십시오. 동시에 여러 개의 독립 스트림을 만들려면 RandStream.create 함수를 사용하십시오.

설명

예제

s = RandStream(gentype)gentype으로 지정된 균일 의사 난수 생성기 알고리즘을 사용하는 난수 스트림을 만듭니다.

예제

s = RandStream(gentype,Name,Value)는 하나 이상의 선택적 Name,Value 쌍의 인수를 사용하여 스트림의 속성도 제어합니다.

입력 인수

모두 확장

난수 생성기 알고리즘으로, 난수 생성기의 이름을 지정하는 문자형 벡터 또는 string형 스칼라로 지정됩니다. MATLAB은 몇 가지 생성기 알고리즘을 제공합니다. 다음 표에는 사용 가능한 생성기 알고리즘의 이름과 주요 속성이 요약되어 있습니다. 일부 생성기 알고리즘은 상호 독립적인 난수 집합을 만들 수 있도록 다중 스트림과 서브스트림을 지원합니다. 자세한 내용은 난수 스트림을 만들고 제어하기 항목을 참조하십시오.

이름생성기다중 스트림 및 서브스트림 지원 여부최대 정밀도의 근사 주기
'mt19937ar'메르센 트위스터(Mersenne Twister)아니요219937-1
'dsfmt19937'SIMD 기반 고속 메르센 트위스터(SIMD-Oriented Fast Mersenne Twister) 아니요219937-1
'mlfg6331_64'시차 피보나치 수열 생성기2124(길이가 272인 251개의 스트림)
'mrg32k3a'결합 다중 재귀적 생성기2191(길이가 2127인 263개의 스트림)
'philox4x32_10'10회 라운드의 Philox 4x32 생성기2193(길이가 2129인 264개의 스트림)
'threefry4x64_20'20회 라운드의 Threefry 4x64 생성기2514(길이가 2258인 2256개의 스트림)
'shr3cong'선형 합동법 생성기로 계산된 시프트 레지스터 생성기아니요264
'swb2712'수정된 자리 내림을 사용하는 뺄셈 생성기아니요21492
'mcg16807'승산식 합동법 생성기아니요231-2
이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: s = RandStream('mt19937ar','Seed',15,'NormalTransform','Polar')

난수 시드값으로, 'Seed'와 함께 음이 아닌 정수 또는 'shuffle'이 쉼표로 구분되어 지정됩니다. 시드값은 알고리즘이 난수를 생성할 시작점을 지정합니다. 'shuffle'은 현재 시간을 기반으로 시드값을 만듭니다. 정수를 지정할 경우 0과 232 − 1 사이여야 합니다.

스트림을 만들 때 MATLAB 시작 시점에 또는 시뮬레이션을 실행하기 전에 초기화 단계로 생성기 시드값을 지정하십시오. 스트림을 재현하려면 매번 동일한 시드값을 사용하십시오. 여러 개의 시드값을 사용하면 여러 개의 난수열이 만들어지지만, 서로 다른 수열이 통계적으로 독립적이라는 보장은 없습니다. 이것이 중요한 경우에는 Substream 속성을 지정하거나 RandStream.create를 사용하여 통계적으로 독립적인 스트림을 만드십시오.

randn을 사용하여 난수 스트림에서 정규분포된 난수를 생성하는 변환 알고리즘으로, 'NormalTransform'과 함께 알고리즘 이름 'Ziggurat', 'Polar' 또는 'Inversion' 중 하나가 쉼표로 구분되어 지정됩니다. 자세한 내용은 난수 스트림을 만들고 제어하기 항목을 참조하십시오.

속성

모두 확장

난수 스트림 s에는 s의 동작을 제어하는 속성이 있습니다. 속성에 액세스하려면 p = s.Property를 사용하고, 속성을 수정하려면 s.Property = p를 사용하십시오. 스트림 s의 모든 속성을 저장하고 복원하려면 각각 A = get(s)set(s,A)를 사용하면 됩니다. 이 목록은 RandStream의 속성을 설명합니다.

읽기 전용 속성입니다.

스트림에서 사용되는 난수 생성기 알고리즘입니다. 생성기와 그 속성의 요약을 보려면 생성기 알고리즘 표를 참조하십시오.

모든 생성기 알고리즘이 다중 스트림을 지원하는 것은 아닙니다. 일부 생성기의 경우 통계적으로 독립적인 다중 스트림과 서브스트림을 만들 수 있습니다.

데이터형: char

읽기 전용 속성입니다.

스트림을 만드는 데 사용되는 난수 시드값으로, 음이 아닌 정수로 반환됩니다.

데이터형: uint32

읽기 전용 속성입니다.

현재 스트림이 만들어진 그룹에 포함된 스트림 개수로, 양의 정수로 반환됩니다.

데이터형: uint64

읽기 전용 속성입니다.

현재 스트림이 만들어진 스트림 그룹에서 현재 스트림의 인덱스로, 양의 정수로 반환됩니다.

데이터형: uint64

생성기의 현재 내부 상태로, 정수 벡터로 지정됩니다. 상태 벡터의 크기는 생성기 알고리즘에 따라 달라집니다. 사용자가 이 속성을 설정하는 경우 s.State에 할당하는 값은 s.State에서 이전에 읽은 값이어야 합니다. 스트림을 미리 State 속성에서 읽지 않고 초기 상태로 반환하려면 reset을 사용하십시오. 생성기의 내부 상태를 State 속성으로 저장하고 복원하는 방법으로 난수열을 재현할 수 있습니다.

내부 상태는 난수 스트림 s에서 생성되는 난수열을 결정합니다. 단일 스트림에서 난수를 생성할 때마다, 스트림의 생성기 상태가 변환되어 통계적으로 독립적이고 똑같이 분산된 후속 값들을 만듭니다.

참고

스트림에서 결과를 재현하려면 난수 스트림의 상태만 복원하거나 스트림을 재설정하십시오.

데이터형: uint32

스트림이 현재 설정된 서브스트림의 인덱스입니다.

일부 생성기 유형의 경우, 난수 스트림에서 각기 다른 서브스트림을 만들 수 있습니다. 각기 다른 서브스트림에서 생성된 값은 상호 독립적입니다. 서브스트림을 지원하는 생성기를 보려면 생성기 알고리즘 표를 참조하십시오.

데이터형: double

randn을 사용하여 정규분포 의사 난수 값을 생성하는 변환 알고리즘입니다.

데이터형: char

s가 대조 의사 난수 값을 생성하는지 여부로, 논리값 true(1) 또는 false(0)로 지정됩니다. 대조 값은 디폴트로 생성되는 균등분포 의사 난수 값을 1에서 뺀 값입니다.

데이터형: logical

s가 최대 정밀도를 사용하여 값을 생성하는지 여부로, 논리값 true(1) 또는 false(0)로 지정됩니다. FullPrecisionfalse인 경우 일부 생성기는 의사 난수 값을 더 빠르게, 그러나 더 적은 난수 비트를 사용하여 만들 수 있습니다.

데이터형: logical

객체 함수

기본적으로 rand와 같은 난수 생성 함수는 전역 난수 스트림을 사용합니다. 다른 스트림을 지정하려면 RandStream 객체를 만들고 이 객체를 첫 번째 입력 인수로 전달하십시오. 예를 들어, SIMD 기반 고속 메르센 트위스터를 사용하여 난수로 구성된 4×1 벡터를 만듭니다.

s = RandStream('dsfmt19937');
r = rand(s,4,1);

다음 함수는 RandStream 객체를 받습니다.

rand균일하게 분포된 난수

지원되는 구문으로, 여기서 sRandStream 객체입니다.

X = rand(s)
X = rand(s,n)
X = rand(s,sz1,...,szN)
X = rand(s,sz)
X = rand(s,__,typename)
X = rand(s,__,'like',p)
다른 입력 인수에 대한 자세한 내용은 rand, randirandn을 참조하십시오.

randi균일하게 분포된 정수형 의사 난수
randn정규분포된 난수
randperm정수로 구성된 난수 순열

지원되는 구문으로, 여기서 sRandStream 객체입니다.

p = randperm(s,n)
p = randperm(s,n,k)
다른 입력 인수에 대한 자세한 내용은 randperm을 참조하십시오.

RandStream의 다른 객체 함수는 다음과 같습니다.

RandStream.create통계적으로 독립적인 난수 스트림 생성
RandStream.list난수 생성기 알고리즘 나열
RandStream.getGlobalStreamGet current global random number stream
RandStream.setGlobalStreamSet global random number stream
resetReset random number stream

예제

모두 축소

SIMD 기반 고속 메르센 트위스터를 사용하여 난수 스트림을 만듭니다.

s = RandStream('dsfmt19937')
s = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Ziggurat

스트림을 사용하여 5개의 난수를 생성합니다.

rand(s,1,5)
ans = 1×5

    0.0306    0.2131    0.2990    0.3811    0.8635

현재 시간에 기반한 생성기 시드값을 사용하여 난수 스트림을 만듭니다. 일반적으로 이 방법은 MATLAB이 생성하는 난수의 통계 속성에 영향을 줄 수 있으므로, MATLAB® 세션당 두 번 이상 사용하는 것은 좋지 않습니다.

s = RandStream('mt19937ar','Seed','shuffle');

스트림을 사용하여 0과 1 사이에 균등분포된 난수 값으로 구성된 3×3 행렬을 만듭니다.

X1 = rand(s,3)
X1 = 3×3

    0.5749    0.5417    0.7486
    0.0671    0.2907    0.0807
    0.4128    0.3117    0.2276

스트림에서 추가로 5개의 난수를 만듭니다.

X2 = rand(s,1,5)
X2 = 1×5

    0.9590    0.0137    0.0476    0.1600    0.2947

단정밀도 숫자로 구성된 2×3 행렬을 만듭니다.

p = single([0.1 -3 2.5; 1.2 -3.4 6]);

시드값이 0인 난수 스트림을 만듭니다.

s = RandStream('mcg16807','Seed',0);

스트림을 사용하여 크기와 데이터형이 p와 동일한, 난수로 구성된 배열을 만듭니다.

z = rand(s,size(p),'like',p)
z = 2x3 single matrix

    0.2190    0.6789    0.9347
    0.0470    0.6793    0.3835

class(z)
ans = 
'single'

시드값이 0인 난수 스트림을 만듭니다.

s = RandStream('mcg16807','Seed',0);

스트림에서 5개의 난수를 생성합니다. 스트림에서 난수를 하나 생성할 때마다 생성기 알고리즘은 다음에 생성되는 난수가 직전 난수와 독립적이고 똑같이 분산되도록 내부 상태를 변환합니다.

u1 = rand(s,1,5)
u1 = 1×5

    0.2190    0.0470    0.6789    0.6793    0.9347

생성기의 현재 상태를 저장합니다. 추가로 5개의 난수를 생성합니다.

savedState = s.State;
u2 = rand(s,1,5)
u2 = 1×5

    0.3835    0.5194    0.8310    0.0346    0.0535

5개 난수의 마지막 결과를 재현하려면 생성기의 상태를 저장된 상태로 복원하십시오.

s.State = savedState;
u3 = rand(s,1,5)
u3 = 1×5

    0.3835    0.5194    0.8310    0.0346    0.0535

스트림에서 특정 결과를 재현하려는 경우에만 생성기를 읽고 쓰십시오.

시드값이 3인 난수 스트림을 만듭니다. 스트림을 사용하여 8개의 난수를 생성합니다.

stream = RandStream('dsfmt19937','Seed',3);
z = rand(stream,1,8)
z = 1×8

    0.2550    0.8753    0.0908    0.1143    0.3617    0.8210    0.8444    0.6189

난수 스트림을 시드값이 3인 초기 상태로 재설정합니다. 생성된 8개의 난수를 재현합니다.

reset(stream,3);
z = rand(stream,1,8)
z = 1×8

    0.2550    0.8753    0.0908    0.1143    0.3617    0.8210    0.8444    0.6189

스트림의 시드값을 재설정하면 다른 스트림과의 독립성이 무효화될 수 있습니다. 스트림에서 결과를 재현하려는 경우에만 스트림을 재설정하십시오.

2개의 난수 스트림을 만듭니다. RandStream.setGlobalStream을 사용하여 첫 번째 스트림을 전역 스트림으로 설정합니다.

globalStream = RandStream('mlfg6331_64','NormalTransform','Polar')
globalStream = 
mlfg6331_64 random stream
             Seed: 0
  NormalTransform: Polar

RandStream.setGlobalStream(globalStream);

현재 전역 스트림을 표시하려면 RandStream.getGlobalStream을 사용하십시오.

RandStream.getGlobalStream
ans = 
mlfg6331_64 random stream (current global stream)
             Seed: 0
  NormalTransform: Polar

앞에서 만든 새로운 전역 스트림과 별개로 동작하는 두 번째 스트림 myStream을 만듭니다.

myStream = RandStream('dsfmt19937','NormalTransform','Inversion')
myStream = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Inversion

전역 스트림에서 3개의 난수를 생성합니다. 앞에서 만든 로컬 스트림 myStream에서 추가로 3개의 난수를 생성합니다.

randn(1,3)
ans = 1×3

    0.8715    1.0588   -0.6956

randn(myStream,1,3)
ans = 1×3

   -1.8723   -0.7956   -0.5273

myStream을 사용하지 않고 함수 rand, randnrandi를 호출하면 이들 함수는 전역 스트림에서 추출하며, myStream을 사용하여 호출한 결과에 영향을 주지 않습니다.

일부 생성기 유형의 경우, 난수 스트림에서 각기 다른 서브스트림을 만들 수 있습니다. 각기 다른 서브스트림에서 생성된 값은 상호 독립적입니다.

예를 들어, 결합 다중 재귀적(Combined Multiple Recursive) 생성기를 사용하여 난수 스트림을 만듭니다.

s = RandStream('mrg32k3a');

스트림을 특정 서브스트림으로 재배치하려면 스트림의 Substream 속성을 설정하십시오. 예를 들어, 루프에서 난수를 생성합니다. 난수 스트림을 각 루프 반복 앞의 다른 서브스트림 시작 지점에 배치합니다. 5개의 난수로 구성된 3개의 상호 독립적인 집합을 생성합니다.

for i = 1:3
    s.Substream = i;
    z = rand(s,1,5)
end
z = 1×5

    0.7270    0.4522    0.9387    0.2360    0.0277

z = 1×5

    0.5582    0.8527    0.7733    0.0633    0.2788

z = 1×5

    0.1666    0.2924    0.7728    0.8391    0.5107

5개의 난수로 구성된 두 번째 집합을 재현하려면 스트림을 해당 서브스트림에 재배치하십시오.

s.Substream = 2;
z = rand(s,1,5)
z = 1×5

    0.5582    0.8527    0.7733    0.0633    0.2788

세부 정보

모두 확장

확장 기능

버전 내역

R2008b에 개발됨