什么是产生最有效和最简便的方式随机随机在[0,1]
在用Cython? 一种方法是使用INT_MAX
和rand()
的C库:
from libc.stdlib cimport rand
cdef extern from "limits.h":
int INT_MAX
cdef float randnum = rand() / float(INT_MAX)
是否确定使用INT_MAX
这样? 我注意到,这是从你从Python的最大INT得到不断很大的不同:
import sys
print INT_MAX
print sys.maxint
收益率:
2147483647 (C max int)
9223372036854775807 (python max int)
这是正确的“正常化”数rand()
EDIT另外,如何能随机种子来设置(例如,去籽基于当前时间)若用调用的C-方法rand()
从libc的?
C标准说rand
返回一个int
在范围为0〜RAND_MAX以下,所以将其除以RAND_MAX(从stdlib.h
)是归一化它的正确方法。 在实践中,RAND_MAX几乎总是等于MAX_INT,但不依赖于这一点。
由于rand
自C89被ISO C的一部分,它保证是随处可见,但没有担保就其随机数的质量方面。 如果可移植性是你的主要关注,不过,这是你最好的选择,除非你愿意使用Python的random
模块。
Python的sys.maxint
是完全不同的概念; 这只是最大的正数Python可以在自己的int类型代表; 较大的将是多头。 Python的整型和长不是特别相关的到C的。
“C” STDLIB兰特()返回0和RAND_MAX之间的数通常为32767。
有什么理由不使用Python随机的()?
生成0到9之间的随机整数
我不知道如果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)
我碰上了这样的想法 ,而研究,如果你的划分方法产生足够的随机性。 我发现的来源,使好点,在我的情况下,我的随机数用两位数字比较小数,所以我真的只需要的精度3位小数。 所以INT_MAX是绰绰有余。 但是,这似乎是drand48节省师的成本,使可能是值得使用。