./random.sh 10 45
を実行すると、10
と45
の間の乱数しか返されません。Bashの範囲に一致する乱数を生成する
私は
randomNumber=$((1 + RANDOM % 100))
を使用して乱数を生成することができていますが、今どのように私は、ユーザーがランダム数の上限と下限を指定できるようにすることができますか?
./random.sh 10 45
を実行すると、10
と45
の間の乱数しか返されません。Bashの範囲に一致する乱数を生成する
私は
randomNumber=$((1 + RANDOM % 100))
を使用して乱数を生成することができていますが、今どのように私は、ユーザーがランダム数の上限と下限を指定できるようにすることができますか?
次の(純粋BASH)を試してみてくださいshuf
#!/bin/bash
# $1: Lower limit
# $2: Upper limit
# Todo Check arguments
shuf -i $1-$2 -n 1
./random.sh 45 50
を使用することができます。
low=10
hgh=45
rand=$((low + RANDOM%(1+hgh-low)))
アイデアは、下限デフォルトであなたの範囲を設定することで、10
言いますより高い範囲、例えば45
である。したがって、下限をこのように調整してください:$RANDOM % 45 + 10
、そうですか?もう35
があなたの範囲外となりますより
しかし、あなたは35(35 + 10 = 45
あなたの高いバウンド)に達するまで、このソリューションに問題がある、それはあなたが常に0 + 10
と45
の間になるだろうことを前提としていそう実際には動作しますが、 。
範囲に滞在するために、解決策は、あなたがより高いあなたを与える下限追加し、その後バインドに滞在することができます$RANDOM % (higher_b - lower_b)
を行うことです。
$RANDOM % (45 -10) + 10
例間違っ出力:
for i in {0..10};do printf $[RANDOM % 45 + 10]" ";done
47 31 53 23 36 10 22 36 11 25 54
例右出力:
for i in {0..10};do printf $[RANDOM % 35 +10]" ";done
39 44 14 12 38 31 25 13 42 33 16
あなたはまた、を書くことができますインデックスに上限を含める場合は、を選択します。
モジュロの問題は、Nが2のべき乗でない限り、$RANDOM % N
であり、すべての結果について等しい確率分布を持たない:How to generate random number in Bash?。 man bash
あたり、$RANDOM
は0〜32,767(2 ** 15-1)の数値を生成します。状況によってはこれはあまり重要ではないかもしれませんが、表現を少し書き直すことで均等な分布を得ることができます。
for i in {0..10}; do echo -n "$((RANDOM*36/32768 + 10)) "; done; echo
ユーザが選択可能な範囲でのbashスクリプト:
#!/bin/bash
LOW=$1
HIGH=$2
echo $((RANDOM * ($HIGH-$LOW+1)/32768 + LOW))
あなたはまた、いくつかのパラメータのチェックを行うことになるでしょう。
これは、bash組み込みのメカニズムを使用する代わりに、外部ツールを使用します。したがって、random.shは、単独のツールよりもはるかにラッパーになります。 – jehutyy