써 내려 가다

써 내려 가다

인터넷 검색 후에 쉘 명령을 사용하여 특정 범위(예: 최소값과 최대값 사이)에 포함된 임의의 십진 정수를 생성하는 쉬운 방법을 찾을 수 없었습니다.

/dev/random, /dev/urandom및 을 읽었 $RANDOM지만 그 중 어느 것도 내 요구 사항을 충족하지 못했습니다.

다른 유용한 명령이나 이전 데이터를 사용하는 방법이 있습니까?

답변1

shufGNU coreutils를 사용해 볼 수 있습니다 .

shuf -i 1-100 -n 1

답변2

POSIX 도구 상자에서는 다음을 사용할 수 있습니다 awk.

awk -v min=5 -v max=10 'BEGIN{srand(); print int(min+rand()*(max-min+1))}'

하다아니요awk예를 들어, 대부분의 구현에서 명령이 실행된 기간에 따라 숫자를 쉽게 추측할 수 있으므로 암호나 비밀 데이터를 생성하는 소스로 사용합니다 .

많은 awk구현에서 동일한 초 내에 이 명령을 두 번 실행하면 일반적으로 동일한 출력이 제공됩니다.

답변3

써 내려 가다

BSD와 OSX에서는 다음을 사용할 수 있습니다.써 내려 가다-r(포함) 사이의 단일 무작위() 숫자를 반환합니다 .minmax

$ min=5
$ max=10
$ jot -r 1 $min $max

할당 문제

불행하게도 무작위로 생성된 숫자의 범위와 분포는 jot가 내부적으로 배정밀도 부동 소수점 연산과 printf(3)를 출력 형식으로 사용하여 반올림 및 잘림 문제가 발생할 수 있다는 사실의 영향을 받습니다. 따라서 간격 합계는 다음과 같이 덜 자주 생성 min됩니다 .max

$ jot -r 100000 5 10 | sort -n | uniq -c
9918  5
20176 6
20006 7
20083 8
19879 9
9938  10

OS X 10.11(El Capitan)에서는 이 문제가 해결된 것으로 보입니다.

$ jot -r 100000 5 10 | sort -n | uniq -c
16692 5
16550 6
16856 7
16579 8
16714 9
16609 10  

그리고...

$ jot -r 1000000 1 10 | sort -n | uniq -c
100430 1
99965 2
99982 3
99796 4
100444 5
99853 6
99835 7
100397 8
99588 9
99710 10

유통 문제 해결

다행히도 이전 버전의 OS X에 대한 몇 가지 해결 방법이 있습니다. 하나는 printf(3) 정수 변환을 사용하는 것입니다. 주목해야 할 유일한 점은 간격 최대값이 이제 max+1. 정수 형식을 사용하면 구간 전체에 걸쳐 공정한 분포를 얻을 수 있습니다.

$ jot -w %i -r 100000 5 11 | sort -n | uniq -c
16756 5
16571 6
16744 7
16605 8
16683 9
16641 10

완벽한 솔루션

마지막으로 해결 방법을 사용하여 공정한 주사위를 얻으려면 다음이 필요합니다.

$ min=5
$ max_plus1=11  # 10 + 1
$ jot -w %i -r 1 $min $max_plus1

추가 숙제

바라보다메모(1)잔혹한 수학 및 서식 지정 세부정보와 더 많은 예를 알아보세요.

답변4

다음과 같이 임의의 숫자를 얻을 수 있습니다.urandom

head -200 /dev/urandom | cksum

산출:

3310670062 52870

위 번호의 일부를 검색하세요.

head -200 /dev/urandom | cksum | cut -f1 -d " "

그러면 출력은 다음과 같습니다.

3310670062

관련 정보