【问题标题】:Random changing weight随机变化的重量
【发布时间】:2022-01-23 08:04:09
【问题描述】:

我需要实现一个能够根据权重生成随机元素的类。棘手的部分是我还需要能够改变重量。

这是一个示例输出

set_weight("A", 4.0)
set_weight("B", 6.0)
get_random() # return "A" 40% probability, "B" 60%
set_weight("A", 3.0)
get_random() # return "A" 33% probability, "B" 66%

我的解决方法是每次添加权重时查找前缀总和,并将 (element, current_sum_weight) 元组附加到列表中。对于 set_weight("A", 4.0) 和 set_weight("B", 6.0),数组将是 [("A", 4.0), ("B", 10.0)] 然后我生成一个介于 0 和当前总和然后遍历数组以找到小于随机数的第一个总和权重并返回该元素。

但是,我不知道如何更新总和权重,因为那样我将不得不遍历数组,然后找到元素并在之后更新元素的所有权重。有什么方法可以实现权重更新?

我不知道使用字典是否更好,或者我应该使用有序字典。

【问题讨论】:

  • random.choices?
  • 我应该编写自己的类,但我认为我不应该使用内置函数
  • 那么你想如何在没有内置函数的情况下生成随机数呢?
  • 我可以使用 random 模块作为随机数,但我不能使用函数选择,因为它应该是一个 OOP 问题,我必须编写一个 randomGenerator 类并构建权重功能
  • 选择:保持累积 soom,使用 bisect_left 查找插入位置 - 这将减少从线性到对数的搜索时间。 IMO 权重更新:这里无法绕过线性复杂度

标签: python random


【解决方案1】:
class Random_gen:

    def __init__(self):
        self.elements = {}
        

    def set_weight(self, element, weight):
        self.elements[element] = weight

    def get_random(self):
        total_weight = sum(self.elements.values())
        rnd = random.randint(0, total_weight)
        added_weight = 0
        for element, weight in self.elements.items():
            added_weight += weight
            if rnd < added_weight:
                return element
        
        

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多