예를 들어 SRANDOM을 사용하여 동일한 32비트 범위의 난수를 얻으려면 RANDOM을 어떻게 구성합니까?

예를 들어 SRANDOM을 사용하여 동일한 32비트 범위의 난수를 얻으려면 RANDOM을 어떻게 구성합니까?

환경:

  • 더반
  • 불다

알려진 것:

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비트 이동되는 것입니다. 따라서 aaaaaaaaaaaaaaabbbbbbbbbbbbbbba는 첫 번째 값을 나타내는 비트이고 b는 두 번째 값을 나타내는 비트인 것과 유사한 이진수를 얻습니다 .

마찬가지로 원하는 수의 비트를 얻으려면 RANDOMShift SRANDOM( <<) 및또는( |)를 사용한 다음그리고( &). 예를 들어 32비트의 경우 다음 마스크를 사용할 수 있습니다 0xffffffff.

echo "$(( ((RANDOM<<30) | (RANDOM<<15) | RANDOM) & 0xffffffff ))"

( 0xffffffff는 가장 큰 32비트 이진 값으로 십진수로 4294967295입니다. 이를 사용하여 ((1 << 32) - 1)즉시 계산할 수도 있습니다.)


Bash의 매뉴얼은 결과 값의 예측 불가능성에 대해 어떤 약속도 하지 않는 것 같지만 다음과 RANDOM같이 SRANDOM말합니다.

SRANDOM
변수가 참조될 때마다 32비트 의사 난수로 확장됩니다. 난수 생성기는 /dev/urandomOR 를 지원하는 시스템에서 선형이 아니므 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훨씬 더 많음무작위의).

관련 정보