gpt4 book ai didi

python - Python 的 uuid.uuid() 和 C++ 的 std::rand() 之间的冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:22 24 4
gpt4 key购买 nike

我的软件是用 C++ 编写的,由 python 脚本调用(通过 Swig)。当在脚本中调用 python 函数 uuid.uuid1() 时,C++ 的 std::rand() 使用的种子似乎丢失了。这是一个问题,因为我必须能够以 C++ 代码中完全相同的行为重新启动我的软件(这与 uniqid 无关)。

以下示例简化了问题:

C++ 文件 testrand.h :

#ifndef __INCLUDE__TESTRAND_H__
#define __INCLUDE__TESTRAND_H__

void initialize(unsigned long int seed);
unsigned long int get_number();

#endif

C++ 文件 testrand.cpp :

#include "testrand.h" 
#include <cstdlib>

void initialize(unsigned long int seed)
{
std::srand(seed);
}

unsigned long int get_number()
{
return std::rand();
}

Swig 文件 testrand.i :

%module testrand
%{
#include "testrand.h"
%}
%include "testrand.h"

编译是用下面的命令完成的:

swig -python -c++ testrand.i
g++ -c -fPIC testrand.cpp testrand_wrap.cxx -I/usr/include/python2.7/
g++ -shared testrand.o testrand_wrap.o -o _testrand.so

如果我多次启动以下 python 测试用例,我可以看到第一个数字始终相同(正如预期的那样),但在调用 uuid.uuid1() 后生成的第二个数字在每次运行时都会发生变化。

import testrand
import uuid

testrand.initialize(10)

x1 = testrand.get_number()
print x1

uuid.uuid1()

x2 = testrand.get_number()
print x2

多次运行:

> python testcase.py 
1215069295
1691632206

> python testcase.py
1215069295
746144017

> python testcase.py
1215069295
377602282

你知道如何在不杀死我的 C++ 种子的情况下使用 python uuid 吗?提前致谢。 (编辑:我的配置:Linux openSUSE 12.3、64 位、python 2.7.3(但与 2.7.2 存在相同问题)、swig 2.0.9、gcc 4.7.2(但与 4.5.1 存在相同问题))

最佳答案

我在这里找到了 uuid 的代码:http://pythoninside.com/en/source-code/2.7.5/uuid/uuid.py 和我复制并使用了示例脚本中的代码(即没有导入 uuid)。问题来自第 500 行的调用 _uuid_generate_time(_buffer)。此函数定义为 ctypes.CDLL(ctypes.util.find_library('uuid')).uuid_generate_time< 的别名 第 402-410 行。这是我发现的错误的唯一提及:https://savannah.cern.ch/bugs/?24456

关于python - Python 的 uuid.uuid() 和 C++ 的 std::rand() 之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22612752/

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