改变Python的随机抽样算法

时间:2016-02-02 16:05:52

标签: python random

是否可以在Python中配置 random 模块的内部采样算法,将 choice randint 的默认值从正常更改为某些在程序执行期间的其他分布(例如修改种子状态),但是然后只需使用 randint 选择功能?

例如,我想要一些左倾斜采样。

如果是的话,请你指教。

1 个答案:

答案 0 :(得分:4)

numpy库提供lot of different distributions和随机库provides a few too

sample implementation of random表明你所要求的确切无法完成。像choice调用random.random()的方法,按

def choice(self, seq):
        """Choose a random element from a non-empty sequence."""
        return seq[int(self.random() * len(seq))]  

random仅取决于种子。操纵种子以改变分布类型将会非常复杂,并且肯定会违反随机性保证。

如果您真的想要在模块范围内更改默认行为,可以修改__builtin__或破解模块属性,但它似乎更直接

from numpy.random import beta
from random import gauss

def choice(seq):
        return seq[int(beta() * len(seq))]  

或在需要时,或放在中央位置。我还要指出随机模块文档中的注释

  

如果要使用其他类,也可以将类随机子类化   基本       您自己设计的发电机:在这种情况下,覆盖以下内容       方法:random(),seed(),getstate()和setstate()。       (可选)实现getrandbits()方法,以便randrange()       可以覆盖任意大范围。

引入一个BetaRandom类,例如,这样做比使用内置类的可靠行为(通过足够的内省和黑客可能实现)更易于维护,更加可维护。

我还会注意到numpy的setstate 你想要什么

*窃取TessellatingHeckler评论的链接