いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

指定した範囲での乱数を出力 (bash)

概要

Qiitaさんに以下の記事がありました。

qiita.com

面白そうなお題なので、別回答をここにメモメモ。

上の記事では、対象となる範囲を 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

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com