Command-Line
使用 /dev/random、/dev/urandom 生成隨機數據
我正在尋找從命令行使用
/dev/random
(或)的方法。/dev/urandom
特別是,我想知道如何使用這樣的流stdin
將隨機數流寫入stdout
(每行一個數字)。我對機器架構本身支持的所有數字類型的隨機數感興趣。例如,對於 64 位架構,這些將包括 64 位有符號和無符號整數,以及 64 位浮點數。就範圍而言,各種數字類型的最大範圍都可以。
我知道如何使用 Perl、Python 等通用解釋器來完成這一切,但我想知道如何使用 shell 中的“更簡單”工具來完成這一切。(“更簡單”的意思是“即使在非常小的 Unix 安裝中也更有可能可用”。)
基本上,這個問題減少了在命令行上將二進制數據轉換為其字元串表示的問題。(例如,這不會:
printf '%f\n' $(head -c8 /dev/random)
。)我正在尋找與外殼無關的答案。
/dev/random
此外,對於這個問題,和之間的區別/dev/urandom
並不重要。我希望任何適用於一個人的程序都適用於另一個人,即使結果的語義可能不同。我改編了 EightBitTony 的答案以產生
toints
如下所示的功能等。範例使用:
% < /dev/urandom toprobs -n 5 0.237616281778928 0.85578479125532 0.0330049682019756 0.798812391655243 0.138499033902422
評論:
- 我使用
hexdump
而不是od
因為它為我提供了一種更簡單的方法來按照我想要的方式格式化輸出;- 煩人的是,
hexdump
不支持 64 位整數(wtf???);- 函式的介面需要工作(例如,它們應該接受
-n5
以及-n 5
),但考慮到我可憐的 shell 程式技能,這是我能快速組合起來的最好的。(一如既往地歡迎評論/改進。)我從這個練習中得到的最大驚喜是發現在 shell 上編寫最基本的數字內容是多麼**困難(例如讀取十六進制浮點數,或獲得最大的本機浮點值)……
_tonums () { local FUNCTION_NAME=$1 BYTES=$2 CODE=$3 shift 3 local USAGE="Usage: $FUNCTION_NAME [-n <INTEGER>] [FILE...]" local -a PREFIX case $1 in ( -n ) if (( $# > 1 )) then PREFIX=( head -c $(( $2 * $BYTES )) ) shift 2 else echo $USAGE >&2 return 1 fi ;; ( -* ) echo $USAGE >&2 return 1 ;; ( * ) PREFIX=( cat ) ;; esac local FORMAT=$( printf '"%%%s\\n"' $CODE ) $PREFIX "$@" | hexdump -ve $FORMAT } toints () { _tonums toints 4 d "$@" } touints () { _tonums touints 4 u "$@" } tofloats () { _tonums tofloats 8 g "$@" } toprobs () { _tonums toprobs 4 u "$@" | perl -lpe '$_/=4294967295' }
您可以使用和
od
獲取數字。/dev/random``/dev/urandom
例如,
2字節無符號十進制整數,
$ od -vAn -N2 -tu2 < /dev/urandom 24352
1 字節有符號十進制整數,
$ od -vAn -N1 -td1 < /dev/urandom -78
4字節無符號十進制整數,
$ od -vAn -N4 -tu4 < /dev/urandom 3394619386
man od
了解更多資訊od
。
一些shell(例如
bash(1)
)有一個$RANDOM
“變數”,它給出隨機數。