2017-07-16 25 views
0

シェルスクリプトでは、5つのファイルを生成したいと思います。それぞれのファイルに50000〜150000の異なる乱数の範囲を入れたいと思います。私は次のようなものを試しましたシェルスクリプトで乱数を使用するには?

for i in 01 02 03 04 05; do 
A=$((50000+100000)) 
B=$(($B%$A)) 
cat > ${i}.dat << EOF 
AArandom=$A 
EOF 
done 

しかし、これはうまくいきません。どのように乱数を作り、各ファイルをプリントアウトできますか?

+0

@Steveない複製、: '$ RANDOM'が範囲' 0で番号を生成 - 32767'が、ここではより大きな範囲があります必須。 – janos

+0

もしbashで何かしたいのなら、 'man bash'はしばしば良いスタート方法です。マニュアルページは長いです。 'random'のようなキーワードを検索してください... –

+0

私は質問が明示的に> 32767の範囲を注記するように言い直されるべきだと思います。 –

答えて

5

あなたは変数$RANDOMの値を読み取るたびに、 それはあなただからそれはあなたに十分な範囲を与えるものではありません0から32767で0と2^15 - 1、 間の乱数を与えます。 $RANDOMを2桁のbase-15, として使用し、適切なモジュロをとり、適切な範囲正規化を適用できます。

ここでは機能に包まれたロジックです:

randrange() { 
    min=$1 
    max=$2 

    ((range = max - min)) 

    ((maxrand = 2**30)) 
    ((limit = maxrand - maxrand % range)) 

    while true; do 
     ((r = RANDOM * 2**15 + RANDOM)) 
     ((r < limit)) && break 
    done 

    ((num = min + r % range)) 
    echo $num 
} 

そしてあなたは、このようなループ内でファイルを生成することができますrandrangeの実装における注意点があることが

for i in 01 02 03 04 05; do 
    echo "AArandom=$(randrange 50000 150000)" > $i.dat 
done 

注意: 値が偏っている場合にはリロールするループがありますが、理論的にはこの機能が終了しない可能性があります。 実際には、それは非常に起こりそうではありませんが、言及する必要があります。

+0

範囲を広げる良い解決策。結果は偏っているので、完全に一様な分布をしたい場合は、別の構造を使用したいと思うでしょう。理由を調べるには、randrange(2^15-1)* 2^15 +(2^15-1)によって処理できる最高の数よりも1少ない数の範囲を考えます。その範囲を使用すると、各出力数が1より大きい2つの「ランダム」数と、1(1つの乱数は0に等しく、他の1、または両方の数は2^15- 1)、結果は他の数字の2倍になります。 – l0b0

+0

@ l0b0よろしくお願いします。 – janos

1

shufは、あなたが望むものはおそらくです:なぜならレンジ要件の

$ shuf -i 50000-150000 -n 1 
148495 
+0

いいえ、簡単で、汗が出ないほど均一です;-) – janos

+0

もう1つ質問ありがとうございます。私はそれを修正したと思います。 catコマンドでbashスクリプトの中でshufコマンドを使うにはどうすればいいですか? – exsonic01

関連する問題