답변:
사용하십시오 $RANDOM
. 간단한 쉘 산술과 결합하여 종종 유용합니다. 예를 들어, 1에서 10 사이의 난수를 생성하려면 (포함) :
$ echo $((1 + RANDOM % 10))
3
실제 발생기는 variables.c
함수에 brand()
있습니다. 이전 버전 은 간단한 선형 생성기였습니다. 버전 4.0은 1985 년 논문을 인용bash
한 발전기 를 사용합니다 . 이는 아마도 의사 난수의 적절한 출처임을 의미합니다. 시뮬레이션에 사용하지는 않지만 (암호화에는 사용하지는 않지만) 기본 스크립팅 작업에는 적합합니다.
심각한 임의의 숫자가 필요한 작업을 수행 중이 /dev/random
거나 사용 /dev/urandom
가능한 경우 :
$ dd if=/dev/urandom count=4 bs=1 | od -t d
$RANDOM % 10
, $RANDOM
임의의 데이터의 강력한 소스 일지라도, 8 및 9는 0-7보다 측정 가능하게 (마진은 아니지만) 덜 예측 가능하다 .
참조하십시오 $RANDOM
:
$RANDOM
0-32767 범위의 의사 난수를 반환하는 내부 Bash 함수 (상수 아님)입니다. 암호화 키를 생성하는 데 사용해서는 안됩니다.
32767
특별한 의미가?
32767
은 2^16 / 2 - 1
부호있는 16 비트 정수의 상한입니다.
2^15 - 1
않습니까? 동등한 것이므로 누락 된 컨텍스트가 있는지 궁금합니다.
shuf (coreutils에서 사용 가능)를 사용할 수도 있습니다 .
shuf -i 1-100000 -n 1
shuf -i 1-10 -n 1: syntax error in expression (error token is "1-10 -n 1")
$var
범위 끝 대신 다음과 같이 추가하십시오 .var=100 && shuf -i 1-${var} -n 1
-n
. 예 : 1에서 100 사이의 5 개의 난수 생성 :shuf -i 1-100 -n 5
shuf -i 1-10 -n 10
하면 1에서 10까지의 모든 숫자를 얻을 수 있습니다. 지정 -n 15
하면 여전히 정확히 10 개의 숫자 만 한 번만 얻을 수 있습니다. 그것은 무작위 숫자를 생성하지 않고 단지 섞기 만합니다.
쉘에서 이것을 시도하십시오 :
$ od -A n -t d -N 1 /dev/urandom
여기 -t d
에서 출력 형식이 10 진수 부호로 지정되도록 지정합니다. -N 1
에서 1 바이트를 읽도록 지시 /dev/urandom
합니다.
od -A n -t d -N 1 /dev/urandom |tr -d ' '
당신은 또한 awk에서 임의의 숫자를 얻을 수 있습니다
awk 'BEGIN {
# seed
srand()
for (i=1;i<=1000;i++){
print int(1 + rand() * 100)
}
}'
srand()
의 씨앗이 현재 CPU 시간입니다. RNG를 복제 할 수 있도록 특정 시드를 지정해야하는 경우 시드 srand(x)
위치를 사용 x
하십시오. 또한 GNU awk의 숫자 함수 매뉴얼에서 인용 한 "다른 awk 구현은 내부적으로 다른 난수 생성기를 사용합니다." 결론은 통계 분포 생성에 관심이있는 경우 한 플랫폼에서 다른 플랫폼 (모두 실행 awk
또는 gawk
) 에 따라 약간의 변형이 예상된다는 것입니다 .
나는이 트릭을 좋아한다 :
echo ${RANDOM:0:1} # random number between 1 and 9
echo ${RANDOM:0:2} # random number between 1 and 99
...
${RANDOM:0:1}
사용시 : 67.8 %의 확률로 1 또는 2 ${RANDOM:0:2}
를 제공하고 0.03 %의 확률로 단일 숫자 (1 %이어야 함)를 부여 할 수 있으며, 둘 다 0.003 %의 확률로 0을 제공 할 수 있습니다 이것이 좋은 사용 사례가 여전히 있습니다 (예 : 일관성이없는 입력).
Linux 시스템을 사용하는 경우 / dev / random 또는 / dev / urandom 에서 임의의 숫자를 얻을 수 있습니다 . 사용할 수있는 난수가 충분하지 않으면 / dev / random이 차단됩니다. 임의성에 대한 속도가 필요한 경우 / dev / urandom을 사용하십시오.
이 "파일"은 운영 체제에서 생성 된 난수로 채워집니다. 참 또는 의사 난수를 얻는 경우 시스템에서 / dev / random의 구현에 따라 다릅니다. 마우스, 하드 드라이브, 네트워크와 같은 장치 드라이버에서 수집 된 노이즈를 통해 정확한 임의의 숫자가 생성됩니다.
dd 를 사용하여 파일에서 임의의 숫자를 얻을 수 있습니다
나는 이러한 아이디어 중 몇 가지를 취했으며 많은 난수가 필요한 경우 신속하게 수행 해야하는 기능을 만들었습니다.
od
많은 난수가 필요한 경우 통화 비용이 많이 듭니다. 대신 한 번 호출하여 / dev / urandom에서 1024 개의 난수를 저장합니다. 언제rand
호출, 마지막 난수를 반환하고 조정됩니다. 그런 다음 캐시에서 제거됩니다. 캐시가 비어 있으면 다른 1024 개의 난수를 읽습니다.
예:
rand 10; echo $RET
RET에서 0과 9 사이의 난수를 반환합니다.
declare -ia RANDCACHE
declare -i RET RAWRAND=$(( (1<<32)-1 ))
function rand(){ # pick a random number from 0 to N-1. Max N is 2^32
local -i N=$1
[[ ${#RANDCACHE[*]} -eq 0 ]] && { RANDCACHE=( $(od -An -tu4 -N1024 /dev/urandom) ); } # refill cache
RET=$(( (RANDCACHE[-1]*N+1)/RAWRAND )) # pull last random number and scale
unset RANDCACHE[${#RANDCACHE[*]}-1] # pop read random number
};
# test by generating a lot of random numbers, then effectively place them in bins and count how many are in each bin.
declare -i c; declare -ia BIN
for (( c=0; c<100000; c++ )); do
rand 10
BIN[RET]+=1 # add to bin to check distribution
done
for (( c=0; c<10; c++ )); do
printf "%d %d\n" $c ${BIN[c]}
done
업데이트 : 그것은 모든 N에 대해 잘 작동하지 않습니다. 작은 N과 함께 사용하면 임의의 비트를 낭비합니다.이 경우 32 비트 임의의 숫자는 0과 9 사이의 9 개의 난수에 대해 충분한 엔트로피를 가지고 있습니다 (10 * 9 = 1,000,000,000 <= 2 * 32) 32 개의 임의의 소스 값에서 여러 개의 임의의 숫자를 추출 할 수 있습니다.
#!/bin/bash
declare -ia RCACHE
declare -i RET # return value
declare -i ENT=2 # keep track of unused entropy as 2^(entropy)
declare -i RND=RANDOM%ENT # a store for unused entropy - start with 1 bit
declare -i BYTES=4 # size of unsigned random bytes returned by od
declare -i BITS=8*BYTES # size of random data returned by od in bits
declare -i CACHE=16 # number of random numbers to cache
declare -i MAX=2**BITS # quantum of entropy per cached random number
declare -i c
function rand(){ # pick a random number from 0 to 2^BITS-1
[[ ${#RCACHE[*]} -eq 0 ]] && { RCACHE=( $(od -An -tu$BYTES -N$CACHE /dev/urandom) ); } # refill cache - could use /dev/random if CACHE is small
RET=${RCACHE[-1]} # pull last random number and scale
unset RCACHE[${#RCACHE[*]}-1] # pop read random number
};
function randBetween(){
local -i N=$1
[[ ENT -lt N ]] && { # not enough entropy to supply ln(N)/ln(2) bits
rand; RND=RET # get more random bits
ENT=MAX # reset entropy
}
RET=RND%N # random number to return
RND=RND/N # remaining randomness
ENT=ENT/N # remaining entropy
};
declare -ia BIN
for (( c=0; c<100000; c++ )); do
randBetween 10
BIN[RET]+=1
done
for c in ${BIN[*]}; do
echo $c
done
od -An -tu4 -N40 /dev/urandom
공백으로 구분 된 10 개의 임의의 부호없는 32 비트 정수를 생성합니다. 배열에 저장하고 나중에 사용할 수 있습니다. 귀하의 코드는 과도한 것으로 보입니다.
/ dev / random 또는 / dev / urandom 문자 특수 파일에서 읽는 것이 좋습니다.
이 장치는 읽을 때 실제로 임의의 숫자를 반환하며 응용 프로그램 소프트웨어가 암호화를위한 보안 키를 선택할 수 있도록 설계되었습니다. 이러한 난수는 다양한 난수 이벤트에 의해 제공되는 엔트로피 풀에서 추출됩니다. {LDD3, Jonathan Corbet, Alessandro Rubini 및 Greg Kroah-Hartman]
이 두 파일은 특히 커널 무작위 화에 대한 인터페이스입니다.
void get_random_bytes_arch(void* buf, int nbytes)
하드웨어에 의해 구현 된 경우 (일반적으로) 또는 엔트로피 풀 (마우스 및 키보드 인터럽트와 같은 이벤트 사이의 타이밍과 SA_SAMPLE_RANDOM에 등록 된 기타 인터럽트)으로 구성된 경우 하드웨어에서 실제로 임의의 바이트를 가져옵니다.
dd if=/dev/urandom count=4 bs=1 | od -t d
이것은 작동하지만 불필요한 출력 dd
을 stdout에 씁니다 . 아래 명령은 필요한 정수만 제공합니다. 산술 확장에 지정된 비트 마스크를 조정하여 필요한 수의 임의의 비트를 얻을 수도 있습니다.
me@mymachine:~/$ x=$(head -c 1 /dev/urandom > tmp && hexdump
-d tmp | head -n 1 | cut -c13-15) && echo $(( 10#$x & 127 ))
어쩌면 나는 너무 늦었지만 jot
Bash의 범위 내에서 임의의 숫자를 생성하는 데 사용 하는 것은 어떻습니까?
jot -r -p 3 1 0 1
-r
소수점 이하 세 자리 정밀도 ( -p
) 의 난수 ( )를 생성합니다 . 이 특정 경우 0과 1 ( 1 0 1
) 사이에 하나의 숫자가 표시 됩니다. 순차 데이터를 인쇄 할 수도 있습니다. 설명서에 따르면 난수의 출처는 다음과 같습니다.
시드가 지정되지 않은 경우 arc4random (3)을 통해, 시드가 제공되면 random (3)을 통해 임의의 숫자를 얻습니다.
@Nelson, @Barun 및 @Robert의 훌륭한 답변을 바탕으로 난수를 생성하는 Bash 스크립트가 있습니다.
/dev/urandom
되는은 훨씬 더 배쉬의보다 내장$RANDOM
#!/usr/bin/env bash
digits=10
rand=$(od -A n -t d -N 2 /dev/urandom |tr -d ' ')
num=$((rand % 10))
while [ ${#num} -lt $digits ]; do
rand=$(od -A n -t d -N 1 /dev/urandom |tr -d ' ')
num="${num}$((rand % 10))"
done
echo $num