当前位置: 首页 > 知识库问答 >
问题:

带更新的加权随机数生成器

章子航
2023-03-14

我的问题是这个问题的延伸:加权随机数

我试图实现一个加权随机数。我目前只是把头撞在墙上,想不出办法。

在我的项目中(Hold'em hand ranges,主观全面公平分析),我使用的是Boost的随机函数。假设我想选择一个介于1和3之间的随机数(1、2或3)。Boost的mersenne捻线机发电机在这方面很有魅力。但是,我希望选择的权重如下:

1 (weight: 90) 2 (weight: 56) 3 (weight:  4)

Boost对此有某种功能吗?

扩展:允许用户动态更改给定密钥的权重。

如何以最佳方式解决问题?

简单的解决方案可能是扫描所有元素,根据新的权重调整所有元素的权重。。。但这是O(n)的更新。效率很低。我们如何做得更好?

我希望update(key,w)get()优于或等于O(logn)

共有3个答案

段干弘毅
2023-03-14

pythonNumpy有一个函数numpy.random.choice,允许您设置概率(和为1)。所以用你的体重你可以做到:

weights = [90, 56, 4]
np.random.choice([1, 2, 3], p=[w / sum(weights) for w in weights])

我不知道复杂性,但是Numpy是一个非常高效的库,所以也许你可以挖掘它的文档和实现。

米修平
2023-03-14

您同时标记了PythonC,我不确定Python是什么,但在C中,这实际上是STL的一部分。看看分段常数分布。

倪子晋
2023-03-14

一种可能的解决方案来自算术编码和芬威克树。

如果您有一个非负数列表,[a_0,...a_n]类型为T,Fenwick树数据结构允许您在O(log n)时间内实现以下两个函数

  1. 索引上限(tp):对于给定值p,计算最小索引i,这样前缀和a\u 0。。。a_i

生成随机数i的算法很简单:生成一个均匀分布在[0,求a_i)范围内的随机数k,然后使用i=上限(k)来查找i

简单的例子:

i            0 1 2 3 4 5 6 7
a_i          0 1 0 0 3 4 0 2
prefix_sum   0 1 1 1 4 8 8 10

k                   0 1 2 3 4 5 6 7 8 9
i = upper_bound(k)  1 4 4 4 5 5 5 5 7 7

P.芬威克。一种新的累积频率表数据结构(PDF,1994)

我的C实现的Fenwick树(未彻底测试)

 类似资料:
  • 问题内容: 我正在尝试设计一种(好的)方法,从可能的数字范围中选择一个随机数,其中该范围内的每个数字都具有权重。简单地说:给定数字范围(0,1,2),请选择一个数字,其中0的概率为80%,1的概率为10%,2的概率为10%。 自从我的大学统计课程上课以来已经有8年了,所以您可以想象一下,目前适合我的方法并不适合我。 这是我想出的“便宜又肮脏”的方法。此解决方案使用ColdFusion。您可以使用任

  • 问题内容: 嗨,当我运行这段代码并返回错误的距离时,不会生成新的随机数。不断产生相同的随机数,从而使我陷入无限循环。有人知道为什么会这样吗?感谢您的光临! 这是输出,如您所见,randomVert从不更改值。 问题答案: 您正在循环中创建背对背的新实例。只需创建一个(在循环之外!),然后在需要新值时询问它随机数。认为它就像在挖一口井- 每次要喝一杯水都不会挖新的井,而是挖一口井,然后根据需要喝多口

  • 假设我得到的是范围内的随机数,使用: 假设它给出的数字小于或等于25,你就赢了,如果它给出的数字大于25,我就赢了。然后我有75%的机会赢。 我该如何加权这个数字大于25的概率的某个百分比,比如说1%。 所以,基本上,我试图将我获胜的几率再提高1%,而不是仅仅说“你赢24分或更少” 如果不清楚,请告诉我。

  • random 生成随机数包 文档:https://www.npmjs.com/package/random 安装:npm install --save random 封装代码: app / extend / context.js // 导入 jwt const jwt = require('jsonwebtoken') // 导入随机数包 const random = require('rando

  • 问题 你需要生成在一定范围内的随机数。 解决方案 使用 JavaScript 的 Math.random() 来获得浮点数,满足 0<=X<1.0 。使用乘法和 Math.floor 得到在一定范围内的数字。 probability = Math.random() 0.0 <= probability < 1.0 # => true # 注意百分位数不会达到 100。从 0 到 100 的范围实

  • 一种解决方案是使用一个仅用于小数点的随机生成器,然后与数字连接。有没有更简单的方法来实现这一点?