乱数が必要

乱数が必要

1 から 6 までのランダムな整数を生成するコマンド ライン スクリプトが必要です。Ubuntu で bash を使用しています。
数か月前に 'bc' を使用してこれに取り組んでいましたが、完全に動作しませんでした。その後、どこまで進んだか忘れてしまいました。

私はこれを使用して、crontab スクリプトを変更し、常に 15 分ごとに実行するのではなく、ランダムな時間 (15+-3 分) に実行するようにしています。つまり、crontab を 12 分ごとに変更し、スクリプト内でスクリプトを実行する前に 1 ~ 6 分間スリープします (これは基本的に、Web ページのステータスを確認するための wget です)。

答え1

マンバッシュを参照してください。パラメーターセクション、シェル変数サブセクション:

RANDOM Each time this parameter is referenced, a random integer between
       0 and 32767 is generated.  The sequence of random numbers may be
       initialized by assigning a value to RANDOM.  If RANDOM is unset,
       it loses its special properties, even if it is subsequently
       reset.

値を1..6の範囲に制限するには、次の$((RANDOM%6+1))式を使用します。1

または、次のように使用することもできます/dev/urandom

tr -dc '1-6' < /dev/urandom | head -c 1

答え2

私はカスタム線形合同型乱数生成器、または X(n+1) = (343*X(n) ) % M17 を提案できます。ここで、M17= 2^17 - 1 = 131071 はメルセンヌ素数 (p=17) です。擬似乱数シーケンスは [0,131070] の範囲で均一に分布しており、次のように範囲を [1,6[ に制限できます。Z6 = 6*X(n)/M17 + 1

サンプルコード:

#!/bin/bash
M=6    #change this if you need different ranges
let "z=(343*10#`date +%N`)%131071"
let "z=$M*z/131071+1"
echo $z

これはワンショットのランダム ジェネレータです。ランダム シーケンスが必要な場合は、シードは10#date +%N開始時に 1 回だけ使用し、ジェネレータはループで使用してください。Ubuntu 12.04 LTS でテスト済みです。お楽しみください。

関連情報