인터넷 검색 후에 쉘 명령을 사용하여 특정 범위(예: 최소값과 최대값 사이)에 포함된 임의의 십진 정수를 생성하는 쉬운 방법을 찾을 수 없었습니다.
/dev/random
, /dev/urandom
및 을 읽었 $RANDOM
지만 그 중 어느 것도 내 요구 사항을 충족하지 못했습니다.
다른 유용한 명령이나 이전 데이터를 사용하는 방법이 있습니까?
답변1
shuf
GNU 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
(포함) 사이의 단일 무작위() 숫자를 반환합니다 .min
max
$ 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