简单的PRNG算法有不同的Python / C输出 - 整数溢出差异?

时间:2013-03-14 06:05:00

标签: python c algorithm prng

编辑:事实证明,我在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

然而,这两者都产生不同的值。我猜测C实现中的next溢出,这就是为什么这两个函数产生不同的值。但是在Python中,数字没有明确的类型,它们不会溢出,并且它们不是无符号的。我怎样才能在Python中复制这种行为?

提前致谢。

3 个答案:

答案 0 :(得分:2)

以每个计算模数(%)2 ^ 32(假设32位整数宽度)应该有效。

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

答案 1 :(得分: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个输入。您可以发布更多内容,以便我们可以看到他们可能分歧的地点/原因吗?

答案 2 :(得分:0)

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