Linux shellで乱数を生成

2142 ワード

本稿では,C/C++などのプログラム言語に含まれないshell下で乱数を生成する方法についてのみ議論する.
$RANDOM
RANDOMはbashの組み込み関数であり、[0,32676]の整数を返します.seedを設定して同じ乱数を得ることもできるし、できるだけランダムにするために毎回異なるseedを設定することもできる.
$ RANDOM=10
$ echo $RANDOM
31855
$ RANDOM=$(date +%s)
$ echo $RANDOM
6676

[beg,end)の範囲内の乱数を生成するには、次のように書くことができます.
function random_range() {
    local beg=$1
    local end=$2
    echo $((RANDOM % ($end - $beg) + $beg))
}

/dev/random &/dev/urandom
この2つはLinux上の文字デバイスで、システムの現在の実行環境のリアルタイムデータを格納しています.これは、システムのある時点の一意の値データと見なすことができるため、乱数メタデータとして使用することができる.両者の違いはrandomがブロックされ、urandomはブロックされないことです.一般的にodコマンドでいいです.
$ od -An -N2 -i /dev/random
$ 26979
$ od -An -N2 -i /dev/urandom
$ 56345

また、データの数行を取得し、チェックサムを計算することもできます.
$ head -10 /dev/urandom | cksum
134919525 2611

注意:catは使わないでください.出力が全然止まらないからです.
seq + sort
sortコマンドには、ランダムhashに基づいてソートできる-Rオプションがあります.では、seqコマンドで整数シーケンスを作成し、sortの-Rオプションで1行を処理すればいいです.例:seq $beg $end | sort -R | head -n1
なお,この方法を用いる場合,要求される値ドメインには負数領域を含めることができる.
shuf
shufは'sort-R'と同様に、入力に基づいてランダムシーケンスを生成するために使用されます.shuf -i $beg-$end -n1
uuid
/proc/sys/kernel/random/uuidファイルに直接アクセスして、唯一のuuidを取得できます.uuidが長いため、最も長い最後のセグメントなど、中間のセグメントを使用したい場合は、cutで取得できます.
$ cat /proc/sys/kernel/random/uuid
4d8c0580-3286-437b-9ae2-707118506c00
$ cat /proc/sys/kernel/random/uuid | cut -f5 -d"-"
b8e195c7760e

最後に
前のuuidで乱数を生成する方法を添付してアクティブコードを生成するshellスクリプト、COUNT、MIN_LEN変数は、合計個数および単一のアクティベーションコードの長さを制御する.
#!/bin/sh
FILE=code.txt
FILE_TMP=${FILE}.tmp
COUNT=100
MIN_LEN=10
GEN_COUNT=`expr ${COUNT} \* 2`

code_len=`cat /proc/sys/kernel/random/uuid | md5sum | cut -d' ' -f1 | wc -c`

if [ ${code_len} -gt ${MIN_LEN} ]; then
    code_len=${MIN_LEN}
fi

for i in `seq ${GEN_COUNT}`
do
    num=`cat /proc/sys/kernel/random/uuid | md5sum | cut -d' ' -f1`
    echo ${num} | cut -b 1-${code_len} >> $FILE_TMP
done


sort $FILE_TMP | uniq | head -${COUNT} | shuf > ${FILE}
rm -f ${FILE_TMP}