たとえば、SRANDOMを使用して同じ32ビット範囲の乱数を取得するには、RANDOMをどのように設定しますか?

たとえば、SRANDOMを使用して同じ32ビット範囲の乱数を取得するには、RANDOMをどのように設定しますか?

環境:

  • ダーバン
  • 吹く

既知のもの:

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ビット移動されることです。したがって、aaaaaaaaaaaaaaabbbbbbbbbbbbbbbaは最初の値を表すビット、bは2番目の値を表すビットと同様の2進数を取得します。

同様に、必要な数のビットを取得するには、RANDOMShift SRANDOM<<)とまたは|)を使用してからそして&)。たとえば、32ビットの場合は、次のマスクを使用できます0xffffffff

echo "$(( ((RANDOM<<30) | (RANDOM<<15) | RANDOM) & 0xffffffff ))"

0xffffffffは最大の32ビットバイナリ値で、10進数で4294967295です。これを使用して((1 << 32) - 1)すぐに計算することもできます。)


Bashのマニュアルは、結果値の予測不可能性について何の約束もしないようですが、次のようにRANDOM述べSRANDOMています。

SRANDOM
変数が参照されるたびに、32ビット疑似乱数に展開されます。乱数ジェネレータは/dev/urandomOR をサポートするシステムでは線形ではないarc4randomため、返される各数値はその前の数字とは関係ありません。

これはRANDOM実際に可能であることを意味します。リニアジョイントジェネレータつまり、これは非常に良いランダムジェネレータではありません。より良いアルゴリズム実装を使用する/dev/urandomのでarc4random、可能であればSRANDOM


あなたのBashバージョンで利用できない場合でも、SRANDOMあなたのシステムで利用可能です/dev/urandom。したがって、提供されたものよりも良い乱数が本当に必要な場合は、RANDOM単に使用できます。回答に基づいて構築ランダムデータを生成するには、/dev/random、/dev/urandom を使用します。arrn任意の32ビット数でシェル配列を埋めます。

n=10
arr=( $(od -vAn -N $((n*4)) -tu4 < /dev/urandom) )

(噴射は意図的に使用されており、IFS数字を含めないでください。)

おすすめ記事