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

但是,它们都产生不同的值。我猜next在 C 实现中会溢出,这就是为什么这两个函数会产生不同的值。但是在 Python 中,数字没有明确的类型,它们不会溢出,也不是无符号的。如何在 Python 中复制这种行为?

提前致谢。

4

3 回答 3

2

您不想在这里使用全局变量,这个问题更适合生成器函数。此外,您当然不想next在 python 中用作变量名,因为它隐藏了一个非常有用的内置名称(实际上我在下面使用它!)

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 回答
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 回答
0
next = 1
def myrand():
    global next
    next = next * 1103515245 + 12345
    return (next & 0xFFFFFFFF / 65536) % 32768
于 2013-03-14T06:15:41.050 回答