/dev/urandom では、特定の範囲の数値のみを受け入れます。

/dev/urandom では、特定の範囲の数値のみを受け入れます。

一般的に、Linux、UNIX、BSD、およびcygwinシステムの/dev/urandomで与えられた範囲の乱数を取得する方法は次のとおりです。

217 < X < 34523

または他の例:

36856 < X < 76543 

ランダム性の観点から100%正確でなければならないので、単に「Googleと最初のクリック」ではなく、解決策を見つけようとすることさえ悩みになります。

自分で書いてみました。

$ cat randomfournumbers.sh
#!/bin/bash

working=true
howmanyneeded=0

while "$working"; do
fivedigit=$(tr -cd "[:digit:]"</dev/urandom|fold -w5|head -1)

        if [ "$fivedigit" -ge 300 ]; then
                if [ "$fivedigit" -le 33000 ]; then

                        echo "$fivedigit"
                        howmanyneeded=$((howmanyneeded+1))

                        if [ "$howmanyneeded" -ge 4 ]; then
                                working=false
                        fi
                fi
        fi
done
$ sh randomfournumbers.sh
11442
26742
13905
23547
$

しかし、私が知っている限り、暗号化、ランダム性...私が見ることができないバグが含まれていると確信しています(urandomには問題はなくロジックです)。

ベストアンサー1

shuf私はこれがより良いツールだと思います。

例:

$ shuf -i 217-34523 -n 1
11623

しかし、本当にを使用したい場合は、/dev/urandom次のようにします。

random_numbers() {
  a="$1"
  b="$2"
  lim="$3"
  count="0"

  while :; do
    num=$(tr -dc '0-9\n' < /dev/urandom | grep -Pom1 "^\\d{${#a},${#b}}")
    if [ "$num" -ge "$a" ] && [ "$num" -le "$b" ]; then
      echo "$num"
      count="$((count + 1))"
      [ "$count" -ge "$lim" ] && break
    fi
  done
}

例:

$ random_numbers 36856 76543 5
75544
55383
43024
72678
63635

おすすめ記事