gpt4 book ai didi

python - glibc rand() 不适用于 python 但在在线编译器中工作正常

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:00 25 4
gpt4 key购买 nike

我正在尝试将 glibc rand() 函数嵌入到 python 中。我的目的是根据使用 LCG 的假设来预测 rand() 的下一个值。我读到它仅在 8 字节状态下运行时才使用 LCG,因此我尝试使用 initstate 方法来设置它。

我的glibc_random.c 文件中有以下代码:

#include <stdlib.h>
#include "glibc_random.h"

void initialize()
{
unsigned int seed = 1;
char state[8];

initstate(seed, state, sizeof(state));
}

long int call_glibc_random()
{
long r = rand();
return r;
}

以及相应的 glibc_random.h 中的以下内容:

void initialize();
long int call_glibc_random();

python 代码:

def test():
glibc_random.initialize()
number_of_initial_values = 10
number_of_values_to_predict = 5
initial_values = []

for i in range(number_of_initial_values):
initial_values.extend([glibc_random.call_glibc_random()])

在 python 中调用时,上面的代码不断将 12345 添加到我的 initial_values 列表中。但是,在 www.onlinegdb.com 中运行 C 代码时我得到了一个更合理的数字列表(11035275900、3774015750 等)。在 initialize 中调用 initstate(seed, state, sizeof(state)) 之后使用 setstate(state) 时,我只能在 onlinegdb 中重现我的问题() 方法。

谁能指出这里出了什么问题?我正在使用 swig 和 python2.7,顺便说一句。

最佳答案

我之前从未使用过initstate但是

void initialize()
{
unsigned int seed = 1;
char state[8];

initstate(seed, state, sizeof(state));
}

我觉得不对。 stateinitialize的局部变量,当函数结束,变量停止退出,所以 rand() 可能会给你垃圾因为它试图访问一个不再有效的指针。

您可以将 state 声明为 static 以便它不会在以下情况下停止存在初始化结束,

void initialize()
{
unsigned int seed = 1;
static char state[8];

initstate(seed, state, sizeof(state));
}

或者使state成为一个全局变量。

char state[8];

void initialize()
{
unsigned int seed = 1;

initstate(seed, state, sizeof(state));
}

关于python - glibc rand() 不适用于 python 但在在线编译器中工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49100554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com