在Cython中生成随机数的正确方法?

19 python random numpy cython

[0,1]在Cython中生成随机随机的最有效和最便携的方法是什么?一种方法是使用INT_MAXrand()来自C库:

from libc.stdlib cimport rand
cdef extern from "limits.h":
    int INT_MAX
cdef float randnum = rand() / float(INT_MAX)
Run Code Online (Sandbox Code Playgroud)

这样使用INT_MAX可以吗?我注意到它与你从Python的max int得到的常量完全不同:

import sys
print INT_MAX
print sys.maxint 
Run Code Online (Sandbox Code Playgroud)

收益率:

2147483647  (C max int)
9223372036854775807  (python max int)
Run Code Online (Sandbox Code Playgroud)

哪个是正确的"标准化"数字rand()编辑另外,如果使用rand()从libc 调用的C方法,如何设置随机种子(例如根据当前时间播种)?

Cai*_*von 11

C标准表示rand返回int0到RAND_MAX(包括0和RAND_MAX)的范围,因此将其除以RAND_MAX(from stdlib.h)是规范化它的正确方法.实际上,RAND_MAX几乎总是等于MAX_INT,但不依赖于此.

因为rand自C89以来已经成为ISO C的一部分,所以它保证可以在任何地方使用,但不保证其随机数的质量.如果可移植性是您主要关注的问题,那么它是您的最佳选择,除非您愿意使用Python的random模块.

Python sys.maxint完全是一个不同的概念; 它只是Python在其自己的 int类型中可以表示的最大正数; 较大的将不得不长.Python的整数和长期与C并不特别相关.