環境:
- ダーバン
- 吹く
既知のもの:
RANDOM
次のように15ビット範囲の乱数を提供します。
echo $RANDOM
SRANDOM
次のように32ビット範囲の乱数を提供します。
echo $SRANDOM
RANDOM
以下では、30ビットの範囲の乱数を生成するように設定できます。
my_rnd=$(((RANDOM<<15|RANDOM)))
echo "$my_rnd"
RANDOM
以下では、45ビットの範囲で乱数を生成するように構成できます。
my_rnd=$(((RANDOM<<15|RANDOM)<<15|RANDOM))
echo "$my_rnd"
RANDOM
私が使用するのと同じ32ビット範囲の乱数を取得するにはどうすればよいですかSRANDOM
?
ベストアンサー1
my_rnd=$(((RANDOM<<15|RANDOM)))
これは、RANDOM
毎回15ビットずつ2回使用され、最初の値が左に15ビット移動されることです。したがって、aaaaaaaaaaaaaaabbbbbbbbbbbbbbb
aは最初の値を表すビット、bは2番目の値を表すビットと同様の2進数を取得します。
同様に、必要な数のビットを取得するには、RANDOM
Shift SRANDOM
(<<
)とまたは(|
)を使用してからそして(&
)。たとえば、32ビットの場合は、次のマスクを使用できます0xffffffff
。
echo "$(( ((RANDOM<<30) | (RANDOM<<15) | RANDOM) & 0xffffffff ))"
(0xffffffff
は最大の32ビットバイナリ値で、10進数で4294967295です。これを使用して((1 << 32) - 1)
すぐに計算することもできます。)
Bashのマニュアルは、結果値の予測不可能性について何の約束もしないようですが、次のようにRANDOM
述べSRANDOM
ています。
SRANDOM
変数が参照されるたびに、32ビット疑似乱数に展開されます。乱数ジェネレータは/dev/urandom
OR をサポートするシステムでは線形ではないarc4random
ため、返される各数値はその前の数字とは関係ありません。
これはRANDOM
実際に可能であることを意味します。リニアジョイントジェネレータつまり、これは非常に良いランダムジェネレータではありません。より良いアルゴリズム実装を使用する/dev/urandom
のでarc4random
、可能であればSRANDOM
。
あなたのBashバージョンで利用できない場合でも、SRANDOM
あなたのシステムで利用可能です/dev/urandom
。したがって、提供されたものよりも良い乱数が本当に必要な場合は、RANDOM
単に使用できます。回答に基づいて構築ランダムデータを生成するには、/dev/random、/dev/urandom を使用します。arr
、n
任意の32ビット数でシェル配列を埋めます。
n=10
arr=( $(od -vAn -N $((n*4)) -tu4 < /dev/urandom) )
(噴射は意図的に使用されており、IFS
数字を含めないでください。)