2

編集:結局のところ、Cバージョンのテストコードでシード値を入力したため(この質問に貼り付けたものと同じではありませんでした)、異なる出力が得られました。みんな、ありがとう。

Cプログラムで疑似乱数を生成し、後でシードをPythonプログラムに渡して、同じ数を生成する必要があります。

PRNGは私が頭の中で考えているものなので、実装を調べました(Cで):

static unsigned long next = 1;

/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}

そしてナイーブなポート:

next = 1

def myrand():
    global next
    next = next * 1103515245 + 12345
    return (next / 65536) % 32768

ただし、これらは両方とも異なる値を生成します。nextCの実装ではオーバーフローが発生していると思います。そのため、2つの関数は異なる値を生成します。しかし、Pythonでは、数値には明示的な型がなく、オーバーフローせず、符号なしではありません。この動作をPythonで複製するにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

2

(%)2 ^ 32(32ビット整数幅を想定)を法としてすべての計算を行うと、機能するはずです。

next = 1
modulo = 2**32
def myrand():
    global next
    next = ((next * 1103515245) + 12345) % modulo
    return (next / 65536) % 32768
于 2013-03-14T06:10:46.523 に答える
2

ここではグローバル変数を使用したくありません。問題はジェネレーター関数により適しています。また、Pythonで変数名として使用したくないのは確かです。これはnext、非常に便利な組み込み名をシャドウイングするためです(実際、以下で使用しています!)

def myrand(seed=1):
    n = seed
    while True:
      n = n * 1103515245 + 12345
      yield (n // 65536) % 32768


g = myrand()
print(next(g))
print(next(g))
print(next(g))

これはpython3で機能し、オーバーフロー処理は必要ないようで、最初の3つの入力と一致します。どこで/なぜ分岐するのかを確認できるように、もう少し投稿していただけますか?

于 2013-03-14T06:24:02.840 に答える
0
next = 1
def myrand():
    global next
    next = next * 1103515245 + 12345
    return (next & 0xFFFFFFFF / 65536) % 32768
于 2013-03-14T06:15:41.050 に答える