鲁棒加权随机串发生器

Ian*_*des 3 python

我已经实现了以下类,根​​据输入频率'p'生成'p'或'q'.但是,如果频率小于用于存储选项的列表的大小,则此实现会中断.有没有办法可以实现这个来为p的任何值工作?

from random import random

class AlleleGenerator(object):
    """
    allele generator - will break if p < 0.001
    """
    def __init__(self, p):
        """construct class and creates list to select from"""
        self.values = list()
        for i in xrange(int(1000*p)):
            self.values.append('p')
        while len(self.values) <= 1000:
            self.values.append('q')
    def next(self):
        """Returns p or q based on allele frequency"""
        rnd = int(random() * 1000)
        return self.values[rnd]
    def __call__(self):
        return self.next()
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 6

不要用self.values.在next,只需生成0到1之间的随机数,'p'如果随机数小于,则返回p:

from random import random

class AlleleGenerator(object):
    def __init__(self, p):
        """construct class and creates list to select from"""
        self.p = p
    def next(self):
        """Returns p or q based on allele frequency"""            
        return 'p' if random() < self.p else 'q'
    def __call__(self):
        return self.next()
Run Code Online (Sandbox Code Playgroud)

另外,当函数足够时,请注意不要使用类.例如,您可以考虑使用生成器函数:

from random import random

def allele_generator(p):
    while True:
        yield 'p' if random() < p else 'q'

agen = allele_generator(0.001)
for i in range(3):
    print(next(agen))
Run Code Online (Sandbox Code Playgroud)

  • @SilasRay:[random.uniform](http://hg.python.org/cpython/file/0056aaf42bf7/Lib/random.py#l340)调用`random.random`.`random.uniform`对于生成任意范围`[a,b)`的随机数非常有用.对于范围`[0,1)`,使用`random.random`. (2认同)