Linux
為什麼在每個系統上計算 /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
它與 ca 1M 以上的任何數據集列印相同。
如果我在輸出中用 grep 查找隨機數,比如說 045765,它會彈出 35-47 次,每次的數量不同。
我寫了一個小python腳本來計算數字,只有一個不是唯一的,但那是啞巴中的最後一個數字,可能是因為EOF。列印數據轉儲時,它總是比其他數字長,而且不合適,所以我們可以忽略它。它證明了沒有數字是唯一的,它用 2621441 行證明有超過 65536 個唯一數字。
我無法理解,這怎麼會發生……該命令中的某些組件必須有一個錯誤。
有沒有人解釋這怎麼會發生?
一個字:八進制。
od
列印的是 from到000000
,177777
數字是0..7
。這些字元串只是以不同方式編碼的兩字節值。不同的編碼不會改變有 65536 種可能性的事實。從足夠大的隨機數據集中,您可以獲得所有數據。即使你“按數字”計算,一切都會合適;你只需要正確地使用八進制。您的嘗試:
可能數字的數量:100000(因為 00000-99999)
假定十進制。正確的方法是這樣的:
- 第一個字元是
0
或1
,(2 種可能性)。- 然後有 5 個字元
0..7
,(每個字元有 8 種可能性)。2 x 8 5 = 2 16