shellの乱数生成の実現方法のまとめ
shellの乱数生成の実現方法のまとめ
1.システムを使用する$RANDOM変数
32767を超える乱数を生成する必要があるなら、以下の方法で実施することができる。
例:40000~500000の乱数を生成する
例:1~50の乱数を生成する
/dev/randowmシステムの現在の動作環境のリアルタイムデータが格納されています。ブロックされた乱数発生器です。読み取りには待ち時間があります。
/dev/urandom無閉塞乱数発生器では、読み取り動作に支障が生じません。
例:100~500の乱数をdev/urandomを使って生成し、urandomを使ってブロックを避ける。
uuidフルネームは汎用一意識別コードで、フォーマットは32個の16進数数字を含み、'-'接続番号で5段に分けられます。形式は8-4-4-12の32文字です。
例:ランダムな文字列を10ビット生成します。
1.システムを使用する$RANDOM変数
mimvp@ubuntu:~$ echo $RANDOM
17617
$RANDOMの範囲は[0,32767]です。32767を超える乱数を生成する必要があるなら、以下の方法で実施することができる。
例:40000~500000の乱数を生成する
#!/bin/bash
function rand(){
min=$1
max=$(($2-$min+1))
num=$(($RANDOM+1000000000)) # 10
echo $(($num%$max+$min))
}
rnd=$(rand 400000 500000)
echo $rnd
exit 0
2.date+%s%Nを使う例:1~50の乱数を生成する
#!/bin/bash
function rand(){
min=$1
max=$(($2-$min+1))
num=$(date +%s%N)
echo $(($num%$max+$min))
}
rnd=$(rand 1 50)
echo $rnd
exit 0
3.使用/dev/randomと/dev/urandom/dev/randowmシステムの現在の動作環境のリアルタイムデータが格納されています。ブロックされた乱数発生器です。読み取りには待ち時間があります。
/dev/urandom無閉塞乱数発生器では、読み取り動作に支障が生じません。
例:100~500の乱数をdev/urandomを使って生成し、urandomを使ってブロックを避ける。
#!/bin/bash
function rand(){
min=$1
max=$(($2-$min+1))
num=$(cat /dev/urandom | head -n 10 | cksum | awk -F ' ' '{print $1}')
echo $(($num%$max+$min))
}
rnd=$(rand 100 500)
echo $rnd
exit 0
4.linux uuidを使用するuuidフルネームは汎用一意識別コードで、フォーマットは32個の16進数数字を含み、'-'接続番号で5段に分けられます。形式は8-4-4-12の32文字です。
mimvp@ubuntu:~/shell$ cat /proc/sys/kernel/random/uuid
fd496199-372a-403e-8ec9-bf4c52cbd9cd
例:linux uuidを使って100~500の乱数を生成する。
#!/bin/bash
function rand(){
min=$1
max=$(($2-$min+1))
num=$(cat /proc/sys/kernel/random/uuid | cksum | awk -F ' ' '{print $1}')
echo $(($num%$max+$min))
}
rnd=$(rand 100 500)
echo $rnd
exit 0
5.ランダムな文字列を生成する例:ランダムな文字列を10ビット生成します。
# date
date +%s%N | md5sum | head -c 10
# /dev/urandom
cat /dev/urandom | head -n 10 | md5sum | head -c 10
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。