[unix] 특정 범위에서 난수 생성

인터넷 검색을 한 후 쉘 명령을 사용하여 특정 범위에 포함 된 임의의 십진 정수를 생성하는 간단한 방법을 찾을 수 없었습니다. 최소와 최대 사이입니다.

나는 읽어 /dev/random, /dev/urandom그리고 $RANDOM,이 중에 내가 필요로 무엇을 할 수 없다.

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



답변

POSIX toolchest에서 다음을 사용할 수 있습니다 awk.

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

마십시오 하지 대부분과 마찬가지로, 암호 또는 예를 들어 비밀 데이터를 생성하기 위해 소스로 저를 사용하여 awk구현, 숫자를 쉽게 실행 된 명령 시간을 기준으로 추측 할 수있다.

많은 awk구현에서, 해당 명령은 동일한 초 내에 두 번 실행되어 일반적으로 동일한 출력을 제공합니다.


답변

shufGNU coreutils에서 시도해 볼 수 있습니다 :

shuf -i 1-100 -n 1


답변

조금

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

추가 숙제

까다로운 수학 및 서식 세부 정보 및 더 많은 예제는 jot (1) 을 참조하십시오 .


답변

$RANDOM변수는 일반적으로 생성 좋은 임의의 값에 좋은 방법이 아니다. 출력 /dev/[u]random도 먼저 변환해야합니다.

더 쉬운 방법은 파이썬과 같은 고급 언어를 사용하는 것입니다.

5와 10 사이의 임의의 정수 변수를 생성하려면 (5 <= N <= 10)

python -c "import random; print random.randint(5,10)"

암호화 응용 프로그램에는 이것을 사용하지 마십시오.


답변

당신은 난수를 통해 얻을 수 있습니다 urandom

head -200 /dev/urandom | cksum

산출:

3310670062 52870

위 숫자의 한 부분을 검색합니다.

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

그런 다음 출력은

3310670062


답변

5와 10 사이의 임의의 정수 변수를 생성하려면 (둘 다 포함)

echo $(( RANDOM % (10 - 5 + 1 ) + 5 ))

% 모듈로 연산자로 작동합니다.

랜덤 변수 $RANDOM를 특정 범위 로 변환하는 더 좋은 방법이있을 것입니다 . 암호화 응용 프로그램이나 시뮬레이션에 사용되는 등분 산 된 실제 랜덤 변수가 필요한 경우에는 이것을 사용하지 마십시오.


답변

# echo $(( $RANDOM % 256 )) 현대 * sh 방언에서 0-255 사이의 “무작위”숫자를 생성합니다.