이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
RandStream
을 사용하여 전역 스트림 관리하기
rand
, randn
, randi
및 randperm
함수는 전역 스트림이라고 하는 기본 난수 스트림에서 난수를 추출합니다. 전역 스트림은 RandStream
객체입니다. 전역 스트림을 제어하는 간단한 방법은 rng
함수를 사용하는 것입니다. 더 종합적으로 제어하기 위해, RandStream
클래스를 사용하여 전역 스트림과는 별도의 스트림을 만들고 전역 스트림에 대한 핸들을 가져오고 난수 생성을 제어할 수 있습니다.
rng
를 사용하여 난수 생성기를 디폴트 시드값(0
) 및 알고리즘(메르센 트위스터)으로 설정합니다. 생성기 설정을 저장합니다.
rng('default')
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