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

时间:2013-04-22 01:25:44

标签: python random numpy cython

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

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

以这种方式使用INT_MAX是否可以?我注意到它与你从Python的max int得到的常量完全不同:

import sys
print INT_MAX
print sys.maxint 

的产率:

2147483647  (C max int)
9223372036854775807  (python max int)

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

3 个答案:

答案 0 :(得分:10)

C标准说rand返回0到RAND_MAX范围内的int,因此将其除以RAND_MAX(来自stdlib.h)是规范化它的正确方法。实际上,RAND_MAX几乎总是等于MAX_INT,但不依赖于它。

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

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

答案 1 :(得分:3)

'c'stdlib rand()返回0到RAND_MAX之间的数字,通常为32767。

有没有理由不使用python random()?

Generate random integers between 0 and 9

答案 2 :(得分:3)

我不确定drand是否是新增加的,但它似乎完全符合您的要求,同时避免了昂贵的分工。

cdef extern from "stdlib.h":
    double drand48()
    void srand48(long int seedval)

cdef extern from "time.h":
    long int time(int)

# srand48(time(0))
srand48(100)
# TODO: this is a seed to reproduce bugs, put to line of code above for
# production
drand48() #This gives a float in range [0,1)

我在研究你的除法是否产生足够的随机性时遇到了this idea。我发现的源代码很好,在我的情况下,我将随机数与两位数的小数进行比较,所以我真的只需要3个小数点的精度。所以INT_MAX绰绰有余。但是,似乎drand48节省了分割成本,因此可能值得使用。