- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
像https://softwareengineering.stackexchange.com/questions/150616/return-random-list-item-by-its-weight这样的典型问题很多
想象更高级的问题。
你有 N 对 (item_id, weight)
信息来源。我们称它们为碎片。分片包含成对列表 (item_id, weight)
.
你有一个中心节点,我们称它为Central.
问题是:在 Central 上,根据所有权重的权重,从 The Big List(该列表实际上是从所有分片上的所有列表中合并而成的列表)中随机选择项目。
例如,我们有两个分片:
+--------+----------+--------+
|分片 |项目编号 |重量 |
+--------+----------+--------+
| 1 | 1 | 7 |
| 1 | 2 | 4 |
| 1 | 3 | 2 |
| 2 | 4 | 5 |
| 2 | 5 | 1 |
+--------+----------+--------+
(让 item_id
在所有分片中都是唯一的。)
第一个问题:
如何随机选择 item_id
但对所有分片进行加权?IE。 total_weight == 7+4+2+5+1 == 19
,所以 1
将以 7/19 的概率被选中,2
- 4/19,3
- 2/19 等等。
第二个问题:
如何随机排列所有分片中的所有项目,但通过所有分片加权?
即理想的范围是:1, 4, 2, 3, 5
(根据它们的权重),
但可能还有另一个范围,如 1, 2, 4, 3, 5
,但频率比以前略低,
...
最坏情况 5, 3, 2, 4, 1
也可能出现,但概率非常小。
这在计算机科学中是否存在常见问题?
1 Câu trả lời
我认为您的两个问题是独立的,应该是单独的问题。我也不确定我是否正确理解了它们。但我们开始吧:
如果您对分片的引用与在多个网络主机上分发项目存储并尝试进行某种网络并行随机选择有关,那么您可以使用修改后的 reservoir sample我在 this answer 末尾概述的算法.
该算法最初是为在冗余网络中使用而开发的,在该网络中,不一定可以从中央主机直接访问各种存储主机,并且连接是图形而不是树。在这种情况下,您需要能够处理不响应的主机(这将偏向于单个查询,但如果网络故障不常见且随机,则希望不会偏向一长串查询)。还需要处理主机被查询两次的可能性;在概述的算法中,我假设如果查询到达主机,则响应很可能返回到查询主机,因此我简单地忽略了第二个和后续查询。这可能是完全错误的,但它使问题变得容易得多,而且它可能在足够多的查询中没有偏见。
没有复杂性,如果中央主机可以可靠地连接到每个存储主机,算法就很简单了。中央主机并行查询所有存储主机,每个存储主机返回其存储的对象总权重的元组,并根据这些权重随机选择一个对象。 (它使用一些标准的加权随机选择算法来做到这一点。使用哪种算法将取决于对象和权重变化的频率。)
中央主机维护两个变量:tổng cộng
,已响应的服务器的权重总和(最初为 0),以及 candidate
,一个可能返回的随机对象(最初是一些指示“没有对象”的标记)。
它以任何顺序一次处理一个响应(例如它收到响应的顺序)。对于每个响应
,它执行以下操作:
tổng cộng
← tổng cộng
+ cân nặng
r
← [0, total)
范围内的随机整数r
< cân nặng
: candidate
← sự vật
当它确定所有远程服务器都已响应时,它返回 candidate
.
(至少,我认为您要求的是加权随机洗牌)。
我打算建议使用标准 Fisher-Yates algorithm用权重修改,我认为这会产生您期望的采样行为。为此,您可以按任意顺序从对象开始,然后是 Tôi
的每个值。来自 1
ĐẾN N
:
j
,从 Tôi
开始的对象中的(加权)随机元素的索引, 并交换对象 Tôi
Và j
.为此,您需要维护连续较小的后缀的 CDF,您可以通过将对象保存在二叉树中来在 O(log N) 中完成此操作。 (或者如果 N 很小,您可以在 O(N) 中更简单地完成。)
但是,在点击“发布”按钮之前,我对 SO 进行了快速搜索,得出的结论是这个 brilliant answer实际上更好,因为它实现了 O(N log N) 而无需任何复杂的数据结构:对于每个对象,您从指数分布中生成一个随机数,其速率是相应的权重。然后根据这些随机数对对象进行排序,结果就是随机洗牌。
关于algorithm - 按重量返回随机元素,高级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39345816/
我让随机数低于之前的随机数。 if Airplane==1: while icounter0: print "You have enoph fuel to get to New
是否可以生成 BigFloat 的随机数?类型均匀分布在区间 [0,1)? 我的意思是,因为 rand(BigFloat)不可用,看来我们必须使用 BigFloat(rand())为了那个结局。然而,
我正在尝试学习 Kotlin,所以我正在学习互联网上的教程,其中讲师编写了一个与他们配合良好的代码,但它给我带来了错误。 这是错误 Error:(26, 17) Kotlin: Cannot crea
是否有任何方法可以模拟 Collections.shuffle 的行为,而不使比较器容易受到排序算法实现的影响,从而保证结果的安全? 我的意思是不违反类似的契约(Contract)等.. 最佳答案 在
我正在创建一个游戏,目前必须处理一些math.random问题。 我的Lua能力不是那么强,你觉得怎么样 您能制定一个使用 math.random 和给定百分比的算法吗? 我的意思是这样的函数: fu
我想以某种方式让按钮在按下按钮时随机改变位置。我有一个想法如何解决这个问题,其中一个我在下面突出显示,但我已经认为这不是我需要的。 import javafx.application.Applicat
对于我的 Java 类(class),我应该制作一个随机猜数字游戏。我一直陷入过去几天创建的循环中。程序的输出总是无限循环,我不明白为什么。非常感谢任何帮助。 /* This program wi
我已经查看了涉及该主题的一些其他问题,但我没有在任何地方看到这个特定问题。我有一个点击 Web 元素的测试。我尝试通过 ID 和 XPath 引用它,并使用 wait.until() 等待它变得可见。
我在具有自定义类的字典和列表中遇到了该异常。示例: List dsa = (List)Session["Display"]; 当我使用 Session 时,转换工作了 10-20 次..然后它开始抛
需要帮助以了解如何执行以下操作: 每隔 2 秒,这两个数字将生成包含从 1 到 3 的整数值的随机数。 按下“匹配”按钮后,如果两个数字相同,则绿色标签上的数字增加 1。 按下“匹配”按钮后,如果两个
void getS(char *fileName){ FILE *src; if((src = fopen(fileName, "r")) == NULL){ prin
如果我有 2 个具有以下字段的 MySQL 数据库... RequestDB: - Username - Category DisplayDB: - Username - Category
我有以下语句 select random() * 999 + 111 from generate_series(1,10) 结果是: 690,046183290426 983,732229881454
我有一个使用 3x4 CSS 网格构建的简单网站。但出于某种原因,当我在 chrome“检查”中检查页面时,有一个奇怪的空白 显然不在我的代码中的标签。 它会导致网站上出现额外的一行,从而导致出现
我有两个动画,一个是“过渡”,它在悬停时缩小图像,另一个是 animation2,其中图像的不透明度以周期性间隔重复变化。 我有 animation2 在图像上进行,当我将鼠标悬停在它上面时,anim
如图所示post在 C++ 中有几种生成随机 float 的方法。但是我不完全理解答案的第三个选项: float r3 = LO + static_cast (rand()) /( static_c
我正在尝试将类添加到具有相同类的三个 div,但我不希望任何被添加的类重复。 我有一个脚本可以将一个类添加到同时显示的 1、2 或 3 个 div。期望的效果是将图像显示为背景图像,并且在我的样式表中
我有一个基本上可以工作的程序,它创建由用户设置的大小的嵌套列表,并根据用户输入重复。 但是,我希望各个集合仅包含唯一值,目前这是我的输出。 > python3 testv.py Size of you
我正在尝试基于 C# 中的种子生成一个数字。唯一的问题是种子太大而不能成为 int32。有什么方法可以像种子一样使用 long 吗? 是的,种子必须很长。 最佳答案 这是我移植的 Java.Util.
我写这个函数是为了得到一个介于 0 .. 1 之间的伪随机 float : float randomFloat() { float r = (float)rand()/(float)RAN
Tôi là một lập trình viên xuất sắc, rất giỏi!