환경:
- 더반
- 불다
알려진 것:
RANDOM
다음과 같이 15비트 범위의 난수를 제공합니다.
echo $RANDOM
SRANDOM
다음과 같이 32비트 범위의 난수를 제공합니다.
echo $SRANDOM
RANDOM
다음을 통해 30비트 범위의 난수를 생성하도록 구성할 수 있습니다.
my_rnd=$(((RANDOM<<15|RANDOM)))
echo "$my_rnd"
RANDOM
다음을 통해 45비트 범위에서 난수를 생성하도록 구성할 수 있습니다.
my_rnd=$(((RANDOM<<15|RANDOM)<<15|RANDOM))
echo "$my_rnd"
RANDOM
내가 사용하는 것과 동일한 32비트 범위의 난수를 얻으려면 어떻게 구성해야 합니까 SRANDOM
?
답변1
my_rnd=$(((RANDOM<<15|RANDOM)))
이것이 하는 일은 RANDOM
매번 15비트씩 두 번 사용되며 첫 번째 값이 왼쪽으로 15비트 이동되는 것입니다. 따라서 aaaaaaaaaaaaaaabbbbbbbbbbbbbbb
a는 첫 번째 값을 나타내는 비트이고 b는 두 번째 값을 나타내는 비트인 것과 유사한 이진수를 얻습니다 .
마찬가지로 원하는 수의 비트를 얻으려면 RANDOM
Shift SRANDOM
( <<
) 및또는( |
)를 사용한 다음그리고( &
). 예를 들어 32비트의 경우 다음 마스크를 사용할 수 있습니다 0xffffffff
.
echo "$(( ((RANDOM<<30) | (RANDOM<<15) | RANDOM) & 0xffffffff ))"
( 0xffffffff
는 가장 큰 32비트 이진 값으로 십진수로 4294967295입니다. 이를 사용하여 ((1 << 32) - 1)
즉시 계산할 수도 있습니다.)
Bash의 매뉴얼은 결과 값의 예측 불가능성에 대해 어떤 약속도 하지 않는 것 같지만 다음과 RANDOM
같이 SRANDOM
말합니다.
SRANDOM
변수가 참조될 때마다 32비트 의사 난수로 확장됩니다. 난수 생성기는/dev/urandom
OR 를 지원하는 시스템에서 선형이 아니므arc4random
로 반환된 각 숫자는 그 앞의 숫자와 관계가 없습니다.
이는 RANDOM
실제로 가능하다는 것을 의미합니다.선형 합동 생성기즉, 이것은 매우 좋은 무작위 생성기가 아닙니다. 더 나은 알고리즘 구현을 사용 /dev/urandom
하므로 arc4random
가능하다면 SRANDOM
.
귀하의 Bash 버전에서 사용할 수 없더라도 SRANDOM
귀하의 시스템에서는 사용할 수 있습니다 /dev/urandom
. 따라서 제공된 것보다 더 나은 난수가 정말로 필요하다면 RANDOM
그냥 사용할 수 있습니다. 답변을 토대로 구축무작위 데이터를 생성하려면 /dev/random, /dev/urandom을 사용하십시오.arr
, n
임의의 32비트 숫자로 쉘 배열을 채웁니다.
n=10
arr=( $(od -vAn -N $((n*4)) -tu4 < /dev/urandom) )
(분사는 의도적으로 사용되었으며 IFS
숫자를 포함해서는 안됩니다.)
답변2
다음을 수행할 수 있습니다.
(( my_rnd = (RANDOM << 17) | (RANDOM << 2) | (RANDOM & 3) ))
즉, 첫 번째 RANDOM의 15비트를 모두 17비트 이동하고, 다른 RANDOM의 또 다른 15비트를 2비트 이동하고, 세 번째 RANDOM의 추가 2비트를 가져옵니다(더 낮은 RANDOM보다 높은 비트를 사용할 수도 있습니다 . RANDOM >> 13
이전 버전에서는 적어도 bash
훨씬 더 많음무작위의).