재초기화 무작위 재초기화

재초기화 무작위 재초기화

다른 컨텍스트에서 변수를 사용하지 않는 경우 $RANDOM변수를 인쇄하면 동일한 결과가 나타납니다. zsh이는 쉘에 명령 출력이나 변수 값의 캐시가 있어서 새 값을 얻을 수 없는 것과 같습니다. 나는 이것을 실행하고 있습니다 :

zsh $ printf \\$(printf "%o" $(( $RANDOM % 123)))\\$(printf "%o" $(( $RANDOM % 123)))

이는 두 번 동일한 결과 $RANDOM이며, 다른 연속 실행에서도 여전히 첫 번째 실행과 동일한 결과를 얻습니다.

여전히 똑같은 행동을 취합니다.printf \\$(printf "%o" $(( $(echo $RANDOM) % 123)))\\$(printf "%o" $(( $(echo $RANDOM) % 123)))

답변1

의 재산입니다 zsh. 또한 man zshparam보십시오 RANDOM:

RANDOM 값은 의도적으로 반복되는 의사 난수 시퀀스를 형성합니다. RANDOM을 참조하는 하위 쉘은 RANDOM 값이 하위 쉘 호출 사이에 상위 쉘에서 참조되거나 시드되지 않는 한 동일한 의사 난수 값을 생성합니다.

내부 서브셸을 평가 중이므로 $RANDOM예상되는 결과는 다음과 같습니다.

$ RANDOM=123
$ echo $(echo $RANDOM) $(echo $RANDOM) $(echo $RANDOM)
17313 17313 17313

Bash 또는 busybox ash에서 동일한 명령:

$ echo $(echo $RANDOM) $(echo $RANDOM) $(echo $RANDOM)
12554 22752 18907

다른 껍질, 다른 행동.


다른 예 zsh:

$ RANDOM=123
$ echo $RANDOM $(echo $RANDOM) $RANDOM $(echo $RANDOM) $RANDOM    
17313 7829 7829 9329 9329

상위 쉘에서 사용될 때마다 $RANDOM후속 하위 쉘에는 의사 무작위 순서로 다음 번호가 지정됩니다. 그러나 자식 쉘은 부모 쉘에 영향을 미치지 않으므로 $RANDOM부모 쉘을 다시 사용할 때 숫자가 반복됩니다.

답변2

두 서브쉘 모두에서 동일한 값을 얻게 되지만 $RANDOM여기서는 서브쉘이 필요하지 않습니다.

주어진 값(또는 산술 표현식)에 해당하는 문자를 얻으려면 #매개변수 확장 플래그를 사용할 수 있습니다.

$ (){ printf %s ${(#)argv}; } RANDOM%123 RANDOM%123
KU

여기서 이 플래그는 익명 함수의 매개변수에 적용됩니다.

다음 을 사용하더라도 printf서브쉘을 생성할 필요는 없습니다 .

$ printf -v var '\\%o' RANDOM%123 RANDOM%123
$ print $var
D#

멀티바이트 로케일에서는 #매개변수 확장 플래그가 wchar_t 값에 해당하는 문자를 제공합니다. GNU 시스템에서는 이것이 유니코드 코드 포인트입니다.

$ () { print ${(#)1}; } 128039

관련 정보