glibc rand()不能使用python,但在在线编译器中工作正常

时间:2018-03-04 21:13:21

标签: python c swig

我试图将glibc rand()函数嵌入到python中。我的目的是根据使用LCG的假设预测rand()的下一个值。我已经读过它只使用LCG,如果它在8字节状态下运行,所以我试图使用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等)。我只能在setstate(state)方法调用initstate(seed, state, sizeof(state))后使用initialize()时在onlinegdb中重现我的问题。

有人能说出这里有什么问题吗?我使用swig和python2.7,顺便说一句。

1 个答案:

答案 0 :(得分:4)

我以前从未使用过initstate但是

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

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

对我来说似乎不对。 stateinitialize的局部变量,当时是rand() 函数结束,变量停止退出,因此state可能会给你垃圾 因为它试图访问不再有效的指针。

您可以将static声明为initialize,以便在此时不会停止存在 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)); } 成为全局变量。

 def lenumerate(s):

    l = []  # list for holding your result

    for x in s.split(): # split sentence into words using split()
        l.append([x, len(x)]) #append a list to l x and the length of x

    return l