Command-Line

使用 /dev/random、/dev/urandom 生成隨機數據

  • August 17, 2021

我正在尋找從命令行使用/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

評論:

  1. 我使用hexdump而不是od因為它為我提供了一種更簡單的方法來按照我想要的方式格式化輸出;
  2. 煩人的是,hexdump不支持 64 位整數(wtf???);
  3. 函式的介面需要工作(例如,它們應該接受-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“變數”,它給出隨機數。

引用自:https://unix.stackexchange.com/questions/268952