网上相关实现非常多,但都不够工具化(主要不适合放在工程代码中),因此贴一段性能和代码结构上都比较满意的代码片。
# -*- coding: utf-8 -*-
from array import array
from copy import deepcopy
from random import random
from bisect import bisect
__all__ = ['WeightedRandom', ]
class WeightObj(object):
'''记录对象和其初始化权重'''
def __init__(self, weight, obj):
self.weight, self.obj = weight, obj
class WeightedRandom(object):
def __init__(self):
'''初始化总权重、权重列表以及随机对象
权重列表:为了节省内存空间使用array结构
'''
self.__total_weight = 0
self.__weight = array('d')
self.__objects = []
def addObject(self, weight, obj):
'''赋权,加对象'''
self.__total_weight += weight
self.__weight.append(self.__total_weight)
self.__objects.append(WeightObj(weight, obj))