【问题标题】:How to pick a random choice using a custom probability distribution如何使用自定义概率分布选择随机选项
【发布时间】:2019-02-07 09:59:13
【问题描述】:

我有一份来自美国人口普查网站的美国姓名及其各自姓名的列表。我想使用给定的概率从此列表中生成一个随机名称。数据在这里:US Census data

我见过像roulette wheel selection 这样易于实现的算法,但我想知道是否有任何方法可以在 O(1) 中生成随机名称。对于histogram data,这更容易,因为您可以创建一个整数哈希到生日,但我想这样做是为了实现连续分布。

如果这不可能,是否有任何 python 模块可以接收概率分布并根据这些分布生成随机值?

【问题讨论】:

  • 您打算使用哪种概率分布?数据集中的许多条目是 0.000。我认为如果你能找到一个超过 3 位小数的来源会更好。
  • 你不能给每个名字按比例分配宽度,然后将一个从 0 到 1 的随机数映射到新的范围上吗?
  • @WaleedKhan,但范围内的查找是 O(log n)

标签: python performance probability


【解决方案1】:

有一个O(1)-time 方法见this detailed description of Vose's "alias" method。不幸的是,它的初始化成本很高。有关更简单方法的比较时序,请参阅Eli Bendersky's blog post。更多时间可查in this from the Python issue tracker

【讨论】:

  • 别名方法读起来很有趣。我认为表格生成可能会成为一个很好的代码高尔夫
  • 我认为别名方法最接近我正在寻找的方法。问题跟踪器也是一个有趣的链接。不过,我必须找到更好的数据来源才能继续。
  • @JDong,请注意,问题跟踪器项目附加了文件,其中包含 Serhiy Storchaka 报告时间的所有方法的 Python 实现。祝你好运! :-)
【解决方案2】:

如今,如果您确实需要O(1) 查找,枚举整个美国人口(约 3.17 亿)是很实用的。只需选择一个高达 3.17 亿的数字并从那里获得名称。 (317000000*4 字节 = 1.268GB)

我认为有很多O(log n) 方式。你需要O(1)有什么特别的原因吗(他们会使用更少的内存)

【讨论】:

  • 这主要是理论上的,但我也想知道是否有比我的膝跳 O(log) 反应更好的解决方案。
猜你喜欢
  • 2011-10-20
  • 2011-02-15
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多