/dev/urandom
다음으로 채워진 파일에서 10MB 파일을 생성하는 방법 :
ASCII 1과 0
0에서 9 사이의 ASCII 숫자
답변1
0에서 9 사이의 ASCII 숫자
< /dev/urandom tr -dc '[:digit:]' | head -c 10000000 > 10mb.txt
ASCII 1과 0
< /dev/urandom tr -dc 01 | head -c 10000000 > 10mb.txt
답변2
수신된 각 바이트의 실제 값은 PRNG에 의해 결정된 대로 해당 바이트 값이 성공적으로 발생할 가능성을 나타내는 한에서만 의미가 있다고 생각하면 </dev/urandom
입력 바이트가 찾고 있는 바이트 근처에 없는지 깨닫게 될 것입니다. 중요한얼마나 자주물론. PRNG가 충분하다면 읽는 모든 바이트에 대해 ASCII 스펙트럼에 어떤 바이트가 나타날 확률은 1/256이어야 합니다.
범위를 ASCII 하위 집합으로 좁히려는 경우 문제를 처리하는 가장 효율적인 방법은 하위 집합에서 해당 문자의 발생을 동시에 확장하고 다른 문자가 발생할 가능성을 제거하는 것입니다. tr
지정된 범위의 문자를 여러 개의 대체 문자로 변환할 수 있으므로 이 기능이 매우 좋습니다. 이와 같이:
d=$(printf '[%d*25]' 1 2 3 4 5 6 7 8 9)
</dev/urandom LC_ALL=C tr '\0-\377' "$d[0*]"
거기에는 몇 가지 일이 진행되고 있습니다.
d=[[char]*[num]]...
tr
여기서는 다음 줄을 제출하려는 두 번째 매개변수가 포함된 var를 설정했습니다 .[]
대괄호 안의 각 값은 변환 대상이며tr
, 각*25
값은 첫 번째 인수에 지정된 순서대로 범위의 멤버 중 몇 개를tr
해당 문자로 변환해야 하는지를 나타냅니다.
LC_ALL=C
- 이것(중요한)규제모든읽은 바이트는 ASCII 바이트로 해석되어야 하므로모두읽혀지는 바이트는 NUL부터 8진수까지입니다
\377
.
- 이것(중요한)규제모든읽은 바이트는 ASCII 바이트로 해석되어야 하므로모두읽혀지는 바이트는 NUL부터 8진수까지입니다
'\0-\377' "$d[0*]"
- 이는
tr
의 값에 따라 모든 입력 바이트를 변환하도록 지시합니다$d
. 이는 바이트를 의미합니다.\0-\30
(또는 범위의 처음 25바이트)\31-\61
1, 2 등 으로 변환됩니다 .
- 이는
결과적으로 모든 입력은 숫자로만 변환됩니다.(거의)무작위성 균일 분포 - 등모든바이트가 사용되지만 궁극적으로 모두 원하는 것입니다. 그러나 위의 예에서 0은 tr
다른 바이트보다 출력에 나타날 가능성이 4% 더 높습니다. 이것이 문제인 경우 다음을 수행할 수도 있습니다.
LC_ALL=C </dev/urandom \
tr '\0-\377' "[\0*5]$d[0*]" |
tr -d \\0
...이 문제가 해결되었습니다.
이제 10M의 경우 다음과 같이 작동합니다.
TR PIPELINE | dd bs=4k count=2560