/dev/urandomの重複した数がすべてのシステムで同じ理由は何ですか?

/dev/urandomの重複した数がすべてのシステムで同じ理由は何ですか?

このコマンドは数値を生成し、/dev/urandom重複した項目数を印刷して、すべてのシステムで同じ結果を返します。なぜ?

dd if=/dev/urandom count=1 bs=5M 2> /dev/null | od - | cut -d " " -f 2- | sed s/" "/"\n"/g | sort -n | uniq -d | wc -l

以下は、このコマンドを実行するすべてのシステムで256^2(16ビット上限)、UNIXシステムのポート数、またはその他のアーキテクチャを含む65536を返すコマンドです。

奇妙な点は各数字が6桁ですが、5Mでもデータダンプが可能な数字よりもはるかに大きいという点~数字が繰り返されない可能性は非常に少ないです。

可能な数の数:100000(00000-99999だから)

データダンプの行(5M):2621441

約1Mを超えるデータセットに対して同じ結果を印刷します。

出力でランダムな数字(045765など)が見つかると、毎回他の数字が35〜47回表示されます。

私は数値を計算するために小さなPythonスクリプトを書いた。唯一のユニークではなかったが、山の最後の数字だった。おそらくEOFのためです。データダンプを印刷するときは、常に残りの数よりも長く収まらないため、無視できます。 65536以上の固有番号があることを証明するために、2621441行を使用して固有の番号がないことを証明します。

どのようにこれが起こったのか理解できません。コマンドの一部のコンポーネントにバグがあるようです。

どのようにこれが起こるのかを説明できる人はいますか?

ベストアンサー1

一言:8進数。

印刷されるのは数字があるところからodです。これらの文字列は、異なる方法でエンコードされた2バイトの値にすぎません。他のエンコーディングは65536の可能性があるという事実を変えません。十分に大きいランダムデータセットからこれらすべてを得ることができます。0000001777770..7

「数字で」計算しても、すべてが正しいです。 8進数を正しく使用してください。あなたの試み:

可能な数の数:100000(00000-99999だから)

小数点とみなされます。正しい方法は次のとおりです。

  • 最初の文字は0または1、(2つの可能性)です。
  • その後、5つの文字があります0..7(各文字に対して8つの可能性)。

2×8 5 = 2 16

おすすめ記事