web-dev-qa-db-ja.com

疑似乱数ジェネレーターの明確化

次のアルゴリズムを使用して、疑似乱数ジェネレーターを作成するように求められます。

ジェネレータは、1からN-1までのすべての整数を1回だけ生成します

N=2^nのアルゴリズム

  • 整数R1と等しくなるように初期化します。これは、タブリングルーチンが呼び出されるたびに、その後、乱数が呼び出されるたびに行われます。
  • セットR=R*5
  • 製品の下位n+2ビットを除くすべてをマスクして、結果をRに配置します。
  • セットp=R/4

製品の下位n+2ビットを除くすべてをマスクするというアルゴリズムの意味は何ですか?

1
Ellipsis...

n = 1の場合、最小3ビットをマスクします

ビッグエンディアンを想定すると、このビットレイアウトになります

128 64  32  16  8   4   2   1
X   X   X   X   X   O   O   O

Oは保持したいビットであり、それらをマスク(ビットごとにAND)するために4、2、および1ビットの高さが必要なため、値7のビットごとの演算子を使用します。 myProduct &= 0x07; // force all bits except the 3 least to be 0

2
JohnKlehm

これは、Pythonインタープリターを使用してバイナリ変換を支援する、実際の例です。

>>> bin(1234567)
'0b100101101011010000111'

n = 4とすると、最後の6ビットを除くすべてをマスクする必要があります。どちらが与えるべきか

>>> n=4
>>> 0b000111
7

ウィキペディアのバイナリページ には ビット単位 操作に関する情報があります。ここでは、AND演算に関心があります

>>> 1234567 & 0b111111
7

このマスクに到達する1つの方法は、(2の累乗であるため)1大きい数を計算し、そこから1を引くことです。

>>> (1<<n+2)-1
63
>>> bin(63)
'0b111111'

(1<<n+2)-1(4<<n)-1に簡略化できますが、この場合は別の方法があります

>>> 1234567 % (4<<n)
7

ビット単位のAND(&)をモジュラス(%)に置き換えました。これは、最下位のn +2ビットをマスクするのと同じ効果があります。

モジュラスはビット単位の操作よりもCPUの作業がわずかに多いため、最高のパフォーマンスが不可欠な場合はビット単位の方法を使用する必要があります

0
gnibbler