Main Content

RandStream을 사용하여 전역 스트림 관리하기

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

rng를 사용하여 난수 생성기를 시작합니다. 생성기 시드값을 0으로 설정하고 생성기 알고리즘을 메르센 트위스터로 설정합니다. 생성기 설정을 저장합니다.

rng(0,'twister')
s = rng
s = struct with fields:
     Type: 'twister'
     Seed: 0
    State: [625x1 uint32]

0과 1 사이의 균일하게 분포된 난수 값으로 구성된 1×6 행 벡터를 만듭니다.

x = rand(1,6)
x = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

RandStream.getGlobalStream을 사용하여 전역 스트림(즉, rand가 난수를 생성하는 기반이 되는 현재 전역 스트림)에 대한 핸들을 반환합니다. RandStream.getGlobalStream을 사용하여 전역 스트림에 대한 핸들을 가져오는 경우 rng를 사용하여 전역 스트림에 수행한 변경 내용을 볼 수 있습니다.

globalStream = RandStream.getGlobalStream
globalStream = 
mt19937ar random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

생성기 시드값과 알고리즘을 변경하고 새로운 확률 행 벡터를 만듭니다. rand가 난수를 생성하는 기반이 되는 현재 전역 스트림을 표시합니다.

rng(1,'philox')
xnew = rand(1,6)
xnew = 1×6

    0.5361    0.2319    0.7753    0.2390    0.0036    0.5262

globalStream = RandStream.getGlobalStream
globalStream = 
philox4x32_10 random stream (current global stream)
             Seed: 1
  NormalTransform: Inversion

다음으로 원래 생성기 설정을 복원하고 확률 벡터를 만듭니다. 결과는 초기 생성기로 만든 원본 행 벡터 x와 일치합니다.

rng(s)
xold = rand(1,6)
xold = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

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

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

r = rand(myStream,1,6)
r = 1×6

    0.0306    0.2131    0.2990    0.3811    0.8635    0.1334

myStream을 첫 번째 입력 인수로 사용하여 rand 함수를 호출하면 myStream에서 수를 추출하고 전역스트림의 결과에는 영향을 미치지 않습니다.

myStream을 전역 스트림으로 설정하려면 RandStream.setGlobalStream 객체 함수를 사용할 수 있습니다.

RandStream.setGlobalStream(myStream)
globalStream = RandStream.getGlobalStream
globalStream = 
dsfmt19937 random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

대부분의 경우 rng 함수로만 전역 스트림을 제어하면 되지만, RandStream 클래스를 사용하여 일부 고급 기능을 제어할 수 있습니다(예: 정규분포 난수 값에 사용되는 알고리즘 선택).

예를 들어, RandStream 객체를 만들고 변환 알고리즘을 지정하여 randn을 사용할 때 정규분포 의사 난수 값을 생성해 보겠습니다. 디폴트 Ziggurat 변환 알고리즘 대신 Polar 변환 알고리즘을 사용하여 정규분포 의사 난수 값을 생성합니다.

myStream = RandStream('mt19937ar','NormalTransform','Polar')
myStream = 
mt19937ar random stream
             Seed: 0
  NormalTransform: Polar

myStream을 전역 스트림으로 설정합니다. 전역 스트림에서 정규분포된 6개의 난수를 만듭니다.

RandStream.setGlobalStream(myStream)
randn(1,6)
ans = 1×6

    0.2543   -0.7733   -1.7416    0.3686    0.5965   -0.0191

참고 항목

|

관련 항목