書いて降りる

書いて降りる

インターネット検索の後、シェルコマンドを使用して、特定の範囲(たとえば、最小値と最大値の間)に含まれる任意の10進整数を生成する簡単な方法を見つけることができませんでした。

/dev/random/dev/urandomとを読ん$RANDOMだが、そのどれも私の要件を満たしていませんでした。

他の便利なコマンドや古いデータを使用する方法はありますか?

答え1

shufGNU coreutilsを試してみてください。

shuf -i 1-100 -n 1

答え2

POSIXツールボックスでは、次のものを使用できますawk

awk -v min=5 -v max=10 'BEGIN{srand(); print int(min+rand()*(max-min+1))}'

するいいえawkたとえば、ほとんどの実装では、コマンドの実行期間に応じて数字を簡単に推測できるため、パスワードや秘密データを生成するソースとして使用します。

多くのawk実装では、同じ秒以内にこのコマンドを2回実行すると、通常同じ出力が得られます。

答え3

書いて降りる

BSDとOSXでは、次のものを使用できます。書いて降りる-r(含む)間の単一のランダム()数を返します。minmax

$ min=5
$ max=10
$ jot -r 1 $min $max

割り当ての問題

残念ながら、ランダムに生成された数値の範囲と分布は、jotが内部的に倍精度浮動小数点演算とprintf(3)を出力形式で使用して丸めと切り捨ての問題を引き起こす可能性があるという事実の影響を受けます。したがって、間隔の合計は次のように頻繁に生成されminません。max

$ jot -r 100000 5 10 | sort -n | uniq -c
9918  5
20176 6
20006 7
20083 8
19879 9
9938  10

OS X 10.11(El Capitan)では、この問題は解決されているようです。

$ jot -r 100000 5 10 | sort -n | uniq -c
16692 5
16550 6
16856 7
16579 8
16714 9
16609 10  

そして…

$ jot -r 1000000 1 10 | sort -n | uniq -c
100430 1
99965 2
99982 3
99796 4
100444 5
99853 6
99835 7
100397 8
99588 9
99710 10

流通のトラブルシューティング

幸いなことに、以前のバージョンのOS Xにはいくつかの解決策があります。一つは printf(3) 整数変換を使うことです。注目すべき唯一の点は、間隔の最大値ですmax+1。整数形式を使用すると、区間全体にわたって公平な分布を得ることができます。

$ jot -w %i -r 100000 5 11 | sort -n | uniq -c
16756 5
16571 6
16744 7
16605 8
16683 9
16641 10

完璧なソリューション

最後に、回避策を使用して公正なサイコロを取得するには、次のものが必要です。

$ min=5
$ max_plus1=11  # 10 + 1
$ jot -w %i -r 1 $min $max_plus1

追加の宿題

バラよりメモ(1)残虐な数学と書式設定の詳細とより多くの例をご覧ください。

答え4

次のように任意の数字を取得できます。urandom

head -200 /dev/urandom | cksum

出力:

3310670062 52870

上記の番号の一部を検索してください。

head -200 /dev/urandom | cksum | cut -f1 -d " "

その後、出力は次のようになります。

3310670062

関連情報