권장되지 않는 rand 구문과 randn 구문 대체하기
권장되지 않는 구문에 대한 설명
이전 버전의 MATLAB®에서 사용자는 'seed'
, 'state'
또는 'twister'
입력값을 통해 rand
함수와 randn
함수가 사용하는 난수 생성기를 제어했습니다. 예를 들면 다음과 같습니다.
rand('seed',sd) randn('seed',sd) rand('state',s) randn('state',s) rand('twister',5489)
이 구문들은 서로 다른 유형의 생성기를 참조하지만, 다음과 같은 이유로 이러한 구문은 더 이상 권장되지 않습니다.
'seed'
와'state'
라는 용어는 생성기와 관련하여 오해의 소지가 있는 이름입니다.'twister'
를 제외한 모든 생성기에 결함이 있습니다.이 구문들은
rand
와randn
에 대해 불필요하게 각기 다른 생성기를 사용합니다.
기존 코드에서 권장되지 않는 구문을 다른 구문으로 바꿀 경우 미치는 영향을 알아보려면 MATLAB 세션 시작 시 다음 명령을 실행하십시오.
warning('on','MATLAB:RandStream:ActivatingLegacyGenerators') warning('on','MATLAB:RandStream:ReadingInactiveLegacyGeneratorState')
대체 구문에 대한 설명
rng
함수를 사용하여 rand
, randn
, randi
와 randperm
, sprand
등의 기타 모든 난수 생성 함수에서 사용되는 공유 생성기를 제어할 수 있습니다. 권장되지 않는 구문을 다른 구문으로 바꿀 때 rng
함수를 사용하는 방법을 익히려면 먼저 여기에서 각 구문의 함수 용법을 살펴보십시오. 그러면 사용자의 요구 사항에 가장 적합한 새 rng
구문을 확인하는 데 도움이 됩니다.
rand(Generator,s)
또는 randn(Generator,s)
의 첫 번째 입력값은 아래 설명된 대로 생성기의 유형을 지정했습니다.
|
이전 버전의 MATLAB에서 생성된 난수를 정확히 다시 생성하려는 경우를 제외하고 v4
생성기와 v5
생성기는 더 이상 권장되지 않습니다. 코드를 업데이트하는 가장 간단한 방법은 rng
를 사용하는 것입니다. rng
함수는 rand
와 randn
생성기의 이름을 다음과 같이 대체합니다.
rand/randn 생성기 이름 | rng 생성기 이름 |
---|---|
'seed' | 'v4' |
'state' |
|
'twister' | 'twister' (권장) |
정수 시드값을 사용하여 생성기를 초기화할 경우의 대체 구문
rand(Generator,sd)
구문에서 정수 시드값 sd
를 사용하는 가장 일반적인 경우는 다음과 같았습니다.
매번 정확히 동일한 난수를 다시 생성하려는 경우(예: 0, 1, 3141879 등의 시드값 사용)
MATLAB이 항상 개별 실행에서 각기 다른 난수를 제공하도록 하려는 경우(예:
sum(100*clock)
과 같은 시드값 사용)
다음 표에서는 정수 시드값 sd
를 사용하는 구문의 대체 구문을 보여줍니다.
첫 번째 열에는 권장되지 않는
rand
와randn
구문이 나와 있습니다.두 번째 열에서는 권장되지 않는 동작을 새
rng
함수를 사용하여 정확히 다시 만드는 방법을 보여줍니다. 대부분의 경우, 이러한 작업은 더 이상 권장되지 않는 v4 생성기 또는 v5 생성기와 같은 레거시 생성기 유형을 지정하여 수행합니다.세 번째 열에서는
rng
에 대한 생성기 유형 입력값(선택 사항)을 지정하지 않는, 권장 대체 구문을 보여줍니다. 따라서,Generator
입력값을 생략하는 경우에는rand
,randn
,randi
가 디폴트 생성기 유형과 시드값을 사용합니다. MATLAB 시작 시 사용되는 디폴트 생성기 유형은 시드값이 0인 메르센 트위스터 생성기입니다. MATLAB 기본 설정에서 난수 생성기의 디폴트 알고리즘과 시드값을 변경할 수 있습니다 (R2023b 이후). 자세한 내용은rng
항목을 참조하십시오.
권장되지 않는 rand/randn 구문 | 권장되지 않음: 생성기 유형을 지정하여 권장되지 않는 동작을 정확히 재생 | 권장 대체 구문: 생성기 유형을 재정의하지 않음 |
---|---|---|
rand('twister',5489) | rng(5489,'twister') | rng('default') |
rand('seed',sd) | rng(sd,'v4') | rng(sd) |
randn('seed',sd) | ||
rand('state',sd) | rng(sd,'v5uniform') | |
randn('state',sd) | rng(sd,'v5normal') | |
rand('seed',sum(100*clock)) | rng(sum(100*clock),'v4') | rng('shuffle') |
상태 벡터를 사용하여 생성기를 초기화할 경우의 대체 구문
rand(Generator,st)
구문에서 상태 벡터(여기서 st
로 표시됨)의 가장 일반적인 용도는 알고리즘이나 반복의 특정 지점에서 생성된 난수를 정확히 재현하는 것이었습니다. 예를 들어, 디버그 시 도움이 되도록 이 벡터를 사용할 수 있습니다.
rng
함수는 다음 표에 나와 있는 것처럼 난수 생성기의 상태를 저장하고 복원하는 패턴을 바꿉니다. 왼쪽 열의 예제에서는 사용자가 v5
균일 생성기를 사용하는 것으로 가정합니다. 오른쪽 열의 예제에서는 새로운 구문을 사용하며, 사용하는 모든 생성기에 적용할 수 있습니다.
rand/randn을 사용한, 권장되지 않는 구문 | rng를 사용하는 새 구문 |
---|---|
% Save v5 generator state. st = rand('state'); % Call rand. x = rand; % Restore v5 generator state. rand('state',st); % Call rand again and hope % for the same results. y = rand | % Get generator settings. s = rng; % Call rand. x = rand; % Restore previous generator % settings. rng(s); % Call rand again and % get the same results. y = rand |
데모를 보려면 이 교육용 비디오를 참조하십시오.
권장되지 않는 구문을 업그레이드할 수 없는 경우
권장되지 않는 난수 생성기 제어 구문을 사용하는 코드가 있지만 이 코드를 사용자가 수정할 수 없거나 수정하는 것이 허용되지 않을 경우, 이 코드를 사용하면 MATLAB이 레거시 모드로 전환된다는 것을 반드시 기억해 두십시오. 레거시 모드에서, rand
와 randn
은 각각 고유한 설정을 갖는 개별 생성기로 제어됩니다.
레거시 모드에서 rand
에 대한 호출은 다음 중 하나를 사용합니다.
'v4'
생성기(rand('seed', ...)
로 제어됨)'v5uniform'
생성기(rand('state', ...)
로 제어됨)'twister'
생성기(rand('twister', ...)
로 제어됨)
레거시 모드에서 randn
에 대한 호출은 다음 중 하나를 사용합니다.
'v4'
생성기(randn('seed', ...)
로 제어됨)'v5normal'
생성기(randn('state', ...)
로 제어됨)
사용하는 코드가 MATLAB을 레거시 모드로 전환하는 경우 다음 명령을 사용하여 레거시 모드에서 빠져나와 디폴트 시작 생성기로 돌아갈 수 있습니다.
rng('default')
또는, MATLAB을 레거시 모드로 전환하는 코드가 이를 수행하지 못하도록 방지하려면 다음을 사용하십시오.
s = rng % Save current settings of the generator. ... % Call code using legacy random number generator syntaxes. rng(s) % Restore previous settings of the generator.