/dev/urandomを使用してASCII番号でファイルを生成しますか?

/dev/urandomを使用してASCII番号でファイルを生成しますか?

/dev/urandom次に、埋め込まれたファイルから10 MBのファイルを生成する方法:

  • 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*]"

そこにはいくつかのことが進んでいます。

  1. d=[[char]*[num]]...

    • trここでは、次の行を送信する2番目のパラメータを含むvarを設定しました。[]角かっこ内の各値は変換対象でありtr、各*25値は最初の引数で指定された順序で範囲のメンバーのうち何個をtrその文字に変換する必要があるかを示します。
  2. LC_ALL=C

    • これ(重要)規制すべて読み取ったバイトはASCIIバイトとして解釈する必要があるためみんな読み取られるバイトは NUL から 8 進数までです\377
  3. '\0-\377' "$d[0*]"

    • これは、trの値に基づいてすべての入力バイトを変換するように指示します$d。これはバイトを意味します。\0-\30 (または範囲の最初の25バイト)\31-\611、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

関連情報