我的问题是这个问题的延伸:加权随机数
我试图实现一个加权随机数。我目前只是把头撞在墙上,想不出办法。
在我的项目中(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)
python
的Numpy
有一个函数numpy.random.choice
,允许您设置概率(和为1)。所以用你的体重你可以做到:
weights = [90, 56, 4]
np.random.choice([1, 2, 3], p=[w / sum(weights) for w in weights])
我不知道复杂性,但是Numpy
是一个非常高效的库,所以也许你可以挖掘它的文档和实现。
您同时标记了Python
和C
,我不确定Python是什么,但在C中,这实际上是STL的一部分。看看分段常数分布。
一种可能的解决方案来自算术编码和芬威克树。
如果您有一个非负数列表,[a_0,...a_n]
类型为T
,Fenwick树数据结构允许您在O(log n)
时间内实现以下两个函数:
索引上限(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 的范围实
一种解决方案是使用一个仅用于小数点的随机生成器,然后与数字连接。有没有更简单的方法来实现这一点?