是否可以在Python中配置 random 模块的内部采样算法,将 choice 和 randint 的默认值从正常更改为某些在程序执行期间的其他分布(例如修改种子或状态),但是然后只需使用 randint 和选择功能?
例如,我想要一些左倾斜采样。
如果是的话,请你指教。
答案 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评论的链接