shellの乱数生成の実現方法のまとめ

2174 ワード

shellの乱数生成の実現方法のまとめ
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
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。