21

[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)

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

import sys
print INT_MAX
print sys.maxint 

产量:

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

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

4

3 回答 3

13

C 标准说rand返回一个int在 0 到 RAND_MAX 范围内的值,因此将它除以 RAND_MAX(从stdlib.h)是对其进行规范化的正确方法。在实践中,RAND_MAX 几乎总是等于 MAX_INT,但不要依赖于此。

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

Pythonsys.maxint完全是一个不同的概念。它只是 Python 可以用自己的int 类型表示的最大正数;较大的必须是多头。Python 的 int 和 long 与 C 没有特别的关系。

于 2013-04-22T02:21:59.190 回答
4

我不确定 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 似乎节省了除法成本,因此可能值得使用。

于 2015-09-23T18:32:30.047 回答
2

'c' stdlib rand() 返回一个介于 0 和 RAND_MAX 之间的数字,通常为 32767。

有什么理由不使用 python random() 吗?

生成 0 到 9 之间的随机整数

于 2013-04-22T02:17:03.653 回答