编辑:事实证明,我在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中复制这种行为?
提前致谢。
答案 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