
インターネット検索の後、シェルコマンドを使用して、特定の範囲(たとえば、最小値と最大値の間)に含まれる任意の10進整数を生成する簡単な方法を見つけることができませんでした。
/dev/random
、/dev/urandom
とを読ん$RANDOM
だが、そのどれも私の要件を満たしていませんでした。
他の便利なコマンドや古いデータを使用する方法はありますか?
答え1
shuf
GNU 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
(含む)間の単一のランダム()数を返します。min
max
$ 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