이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

전역 스트림 관리하기

rand, randn, randi는 전역 스트림이라고 하는 기본 난수 스트림에서 난수를 추출합니다. rng 함수는 전역 스트림을 제어할 수 있는 간단한 방법을 제공합니다. 더 종합적으로 제어하기 위해, RandStream 클래스를 사용하여 전역 스트림에 대한 핸들을 가져오고 난수 생성을 제어할 수 있습니다.

다음과 같이 전역 스트림에 대한 핸들을 가져옵니다.

globalStream = RandStream.getGlobalStream
globalStream = 

mt19937ar random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

get 메서드를 사용하여 스트림의 속성을 반환합니다.

get(globalStream)
             Type: 'mt19937ar'
       NumStreams: 1
      StreamIndex: 1
        Substream: 1
             Seed: 0
            State: [625x1 uint32]
  NormalTransform: 'Ziggurat'
       Antithetic: 0
    FullPrecision: 1

이제, rand 함수를 사용하여 전역 스트림에서 균일한 난수 값을 생성합니다.

rand(1,5);

randn 함수와 randi 함수를 사용하여 전역 스트림에서 정규분포 난수 값과 정수 난수 값을 생성합니다.

A = randi(100,1,5);
A = randn(1,5);

State 속성은 생성기의 내부 상태입니다. globalStreamState를 저장할 수 있습니다.

myState = globalStream.State;

myState를 사용하여 globalStream의 상태를 복원하고 이전 결과를 다시 생성할 수 있습니다.

myState = globalStream.State;
A = rand(1,100);
globalStream.State = myState;
B=rand(1,100);
isequal(A,B)

ans =

     1

rand, randi, randn은 전역 스트림에 액세스합니다. 이들 함수는 모두 동일한 기본 스트림에 액세스하므로, 한 함수를 호출할 경우 후속 호출 시 다른 함수에서 생성되는 값에 영향을 미칩니다.

globalStream.State = myState;
A = rand(1,100);
globalStream.State = myState;
randi(100);
B = rand(1,100);
isequal(A,B)

ans =

     0

전역 스트림은 RandStream 클래스의 핸들 객체입니다. RandStream.getGlobalStream은 핸들을 반환합니다. 전역 스트림의 속성은 스트림에 대한 핸들에서 확인하거나 수정할 수 있습니다.

stream1=RandStream.getGlobalStream;
stream2=RandStream.getGlobalStream;
stream1.NormalTransform='Polar';
stream2.NormalTransform
ans =

Polar

다음 표에서는 RandStream 클래스에 사용할 수 있는 메서드를 보여줍니다. 정적 메서드는 구문 RandStream.methodName으로 표시됩니다.

메서드설명
RandStream난수 스트림을 만듭니다.
RandStream.create여러 개의 독립적인 난수 스트림을 만듭니다.
get난수 스트림의 속성을 가져옵니다.
RandStream.list사용할 수 있는 난수 생성기 알고리즘을 나열합니다.
RandStream.getGlobalStream전역 난수 스트림을 가져옵니다.
RandStream.setGlobalStream전역 난수 스트림을 설정합니다.
set난수 스트림의 속성을 설정합니다.
reset스트림을 해당 초기 내부 상태로 재설정합니다.
rand균등분포에서 의사 난수를 생성합니다.
randn표준 정규분포에서 의사 난수를 생성합니다.
randi이산 균등분포에서 의사 난수 정수를 생성합니다.
randperm일련의 값에 대한 임의 치환입니다.

난수 스트림의 속성이 다음 표에 나와 있습니다.

속성설명
Type(읽기 전용) 스트림에서 사용되는 생성기 알고리즘입니다. RandStream.list는 가능한 생성기를 지정합니다.
Seed(읽기 전용) 스트림을 만드는 데 사용되는 시드값입니다.
NumStreams(읽기 전용) 현재 스트림이 생성된 그룹에 포함된 스트림 개수입니다.
StreamIndex(읽기 전용) 현재 스트림이 생성된 스트림 그룹에서 현재 스트림의 인덱스입니다.
State생성기의 내부 상태입니다. 이 속성의 형식에 의존해서는 안 됩니다. 사용자가 S.State에 할당하는 값은 S.State에서 이전에 읽은 값이어야 합니다.
Substream스트림이 현재 설정된 서브스트림의 인덱스입니다. 디폴트 값은 1입니다. 일부 생성기 유형은 여러 서브스트림을 지원하지 않습니다. 시차 피보나치 수열(Multiplicative Lagged Fibonacci) 생성기(mlfg6331_64)와 결합 다중 재귀적(Combined Multiple Recursive) 생성기(mrg32k3a)는 서브스트림을 지원합니다.
NormalTransformrandn(s, ...)가 일반 의사 난수 값을 생성하는 데 사용하는 변환 알고리즘입니다. 가능한 값은 'Ziggurat', 'Polar', 'Inversion' 중 하나입니다.
AntitheticS가 대조 의사 난수 값을 생성하는지 여부를 나타내는 논리값입니다. 균일 값인 경우 이는 1에서 뺀 일반 값입니다. 디폴트 값은 false입니다.
FullPrecisions가 최상 정밀도를 사용하여 값을 생성하는지 여부를 나타내는 논리값입니다. FullPrecision이 false인 경우 일부 생성기는 의사 난수 값을 더 빠르게, 그러나 더 적은 난수 비트를 사용하여 만들 수 있습니다. 디폴트 값은 true입니다.

시뮬레이션을 반복하기를 원한다고 가정하겠습니다. RandStream 클래스는 출력값을 복제할 수 있는 여러 가지 방법을 제공합니다. 이전 예제에 나와 있는 것처럼, 전역 스트림의 상태를 저장할 수 있습니다.

myState=GlobalStream.State;
A=rand(1,100);
GlobalStream.State=myState;
B=rand(1,100);
isequal(A,B)

ans =

     1

또한, 메서드 reset을 사용하여 스트림을 해당 초기 설정으로 재설정할 수도 있습니다.

reset(GlobalStream)
A=rand(1,100);
reset(GlobalStream)
B=rand(1,100);
isequal(A,B)

ans =

     1

난수 데이터형

randrandn은 기본적으로 배정밀도 값을 생성합니다.

GlobalStream=RandStream.getGlobalStream;
myState=GlobalStream.State;
A=rand(1,5);
class(A)

ans =

double

클래스를 배정밀도로 명시적으로 지정하려면 다음을 사용하십시오.

GlobalStream.State=myState;
B=rand(1,5,'double');
class(B)

ans =

double
isequal(A,B)

ans =

     1

randrandn은 단정밀도 값도 생성합니다.

GlobalStream.State=myState;
A=rand(1,5,'single');
class(A)
ans =

single

이전 예제의 배정밀도 값을 형변환한 것과 같은 값이 생성됩니다. 함수가 값을 추출하는 난수 스트림은 어떤 클래스의 값이 반환되는지에 관계없이 동일한 방법을 진행시킵니다.

A,B

A =

    0.8235    0.6948    0.3171    0.9502    0.0344


B =

    0.8235    0.6948    0.3171    0.9502    0.0344

randi는 정수형 및 단정밀도 또는 배정밀도를 모두 지원합니다.

A=randi([1 10],1,5,'double');
class(A)

ans =

double
B=randi([1 10],1,5,'uint8');
class(B)

ans =

uint8

참고 항목

관련 항목