2017-04-21 12 views
2

./random.sh 10 45を実行すると、1045の間の乱数しか返されません。Bashの範囲に一致する乱数を生成する

私は

randomNumber=$((1 + RANDOM % 100)) 

を使用して乱数を生成することができていますが、今どのように私は、ユーザーがランダム数の上限と下限を指定できるようにすることができますか?

答えて

2

次の(純粋BASH)を試してみてくださいshuf

#!/bin/bash 

# $1: Lower limit 
# $2: Upper limit 
# Todo Check arguments 

shuf -i $1-$2 -n 1 

./random.sh 45 50

+0

これは、bash組み込みのメカニズムを使用する代わりに、外部ツールを使用します。したがって、random.shは、単独のツールよりもはるかにラッパーになります。 – jehutyy

1

を使用することができます。

low=10 
    hgh=45 
    rand=$((low + RANDOM%(1+hgh-low))) 
0

アイデアは、下限デフォルトであなたの範囲を設定することで、10言いますより高い範囲、例えば45である。したがって、下限をこのように調整してください:$RANDOM % 45 + 10、そうですか?もう35があなたの範囲外となりますより

しかし、あなたは35(35 + 10 = 45あなたの高いバウンド)に達するまで、このソリューションに問題がある、それはあなたが常に0 + 1045の間になるだろうことを前提としていそう実際には動作しますが、 。

範囲に滞在するために、解決策は、あなたがより高いあなたを与える下限追加し、その後バインドに滞在することができます$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 

あなたはまた、を書くことができますインデックスに上限を含める場合は、を選択します。

0

モジュロの問題は、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)) 

あなたはまた、いくつかのパラメータのチェックを行うことになるでしょう。

関連する問題