在Cython中[0,1]
生成随机随机的最有效,最便携的方法是什么?一种方法是使用C库中的INT_MAX
和rand()
:
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方法,如何设置随机种子(例如根据当前时间播种)?
答案 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()?
答案 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节省了分割成本,因此可能值得使用。