概要
Qiitaさんに以下の記事がありました。
面白そうなお題なので、別回答をここにメモメモ。
上の記事では、対象となる範囲を seq
コマンドで取得してらっしゃいましたが
この場合だと shuf
コマンドの方が楽かもしれませんね。
shuf
コマンドは、シャッフルの略です。GNU Coreutils に含まれています。
文字通り何らかのリソースを与えるとその中からシャッフルして返してくれます。
-i
オプションを指定すると数値範囲を指定できます。-n
オプションを指定すると「いくつ」表示するかを指定できます。
なので、
$ shuf -i 355-369 -n 1
とすると、355から369の間で一つ選んで出力してくれます。
gitpod /workspace/try-linux $ shuf -i 355-369 -n 1 362
こんな感じ。あとは、これを xargs 経由で bc に渡したら望みの結果になるかと。
サンプル
#!/usr/bin/env bash # # REFERENCES: # - https://qiita.com/Hayao0819/items/4712939f7c2d85c0e938 # - https://stackoverflow.com/questions/2556190/random-number-from-a-range-in-a-bash-script # - https://www.gnu.org/software/coreutils/manual/html_node/shuf-invocation.html # - https://www.atmarkit.co.jp/ait/articles/1705/25/news018.html # # 上のQiitaで示されているオリジナル :<<'#COMMENT_OUT' list=($(seq 355 369)) declare -i out=0 while (( out == 0)); do out=$(printf "%s\n" "${list[@]}" | head -n $(( $RANDOM % ${#list[@]})) | tail -n 1) done echo "scale=1; ${out} / 10" | bc echo '---------------------------------------' #COMMENT_OUT # shuf コマンドを使った版 shuf -i 355-369 -n 1 \ | xargs -I{num} echo "scale=1; obase=10; ibase=10; {num} / 10" \ | bc
try-linux/using_shuf.sh at master · devlights/try-linux · GitHub
実行すると以下のようになります。
gitpod /workspace/try-linux $ make ENTER EXAMPLE NAME: random_u [INPUT ] random_u [TARGET] random_using_shuf [SCRIPT] basic/random/using_shuf.sh ===== START [basic/random/using_shuf.sh] ===== 35.9 ===== END [basic/random/using_shuf.sh] ===== DONE gitpod /workspace/try-linux $ make ENTER EXAMPLE NAME: random_u [INPUT ] random_u [TARGET] random_using_shuf [SCRIPT] basic/random/using_shuf.sh ===== START [basic/random/using_shuf.sh] ===== 36.3 ===== END [basic/random/using_shuf.sh] ===== DONE
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場