Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个模式/算法叫什么?获取一个事件的订阅者的随机顺序,该事件一次只能有一个订阅者作出反应_C#_Algorithm_Design Patterns - Fatal编程技术网

C# 这个模式/算法叫什么?获取一个事件的订阅者的随机顺序,该事件一次只能有一个订阅者作出反应

C# 这个模式/算法叫什么?获取一个事件的订阅者的随机顺序,该事件一次只能有一个订阅者作出反应,c#,algorithm,design-patterns,C#,Algorithm,Design Patterns,我遇到了一个问题,我在c#中有一个事件发布者,向一批订阅者提供全局资源。这种资源是一种竞争性商品,因此可能不会有足够的资源供所有消费者使用 可以想象的模型是一批配料到达市场。许多厨师正在等待每一种配料,他们必须决定是否在每一种配料上桌时购买一些。厨师们一致认为每个人都应该尝试每种配料,他们不希望每种配料都有竞争,所以他们决定应该存在某种优先权制度 1) 这类场景有名字吗 2) 以公平的方式实现这一点的好方法是什么,这样每个订阅者都有平等的机会获得配料?请记住,是否请求资源的决定取决于订阅者 3)

我遇到了一个问题,我在c#中有一个事件发布者,向一批订阅者提供全局资源。这种资源是一种竞争性商品,因此可能不会有足够的资源供所有消费者使用

可以想象的模型是一批配料到达市场。许多厨师正在等待每一种配料,他们必须决定是否在每一种配料上桌时购买一些。厨师们一致认为每个人都应该尝试每种配料,他们不希望每种配料都有竞争,所以他们决定应该存在某种优先权制度

1) 这类场景有名字吗

2) 以公平的方式实现这一点的好方法是什么,这样每个订阅者都有平等的机会获得配料?请记住,是否请求资源的决定取决于订阅者

3) 请注意,优先级不需要固定优先级。如果您在每次活动前掷骰子,您可以每次创建一个顺序。你也可以预先计算一下。这样的解决方案有什么缺点吗


无论如何,这不是一个家庭作业问题。只是想知道是否有人已经看到了这一点,或者是否能够将一个通用的解决方案转换成一个解决这一问题的形式。

听起来像是一个草稿系统。在某些预定顺序中,所有订户都被赋予接受或拒绝资源的权利,直到资源被充分利用为止。诀窍在于如何确定顺序

如果这是我的项目,我想我会从简单开始。从第一个订阅的订阅者开始,然后按顺序浏览列表,直到资源得到充分利用。然后,当其他资源可用时,第一个没有选择权的订阅者(因为资源耗尽)获得优先购买权,并从那里继续。到达终点后,循环回到起点。这是一个很好的模型,当有很多批资源时可以使用,只是每批资源都不够用。厨师的配料模型可以很好地配合这个系统;那天出现的第一位厨师会得到第一选择,如此类推,如果一位厨师被排除在外,不用担心,他会得到下一批的机会

另一种可能的方法是顺序无关。询问所有订阅者是否需要特定资源。如果想要它的人比可用资源多,请将所有订阅者的姓名放入一顶帽子中,并从中选择X;他们得到了资源。那些没有获得资源的人将他们的名字保留在帽子里,这样他们就有了额外的机会获得下一个资源。这是一个更好的模型,当批量资源很小,并且大多数或所有资源都非常理想时,可以使用它,以避免最后一个订阅者必须永远等待才能获得好的机会。WoW战利品系统的工作原理可能有点像这样(简化为所有党员“选择”每件物品;我不玩WoW,所以我从未见过战利品系统工作)

1) 这类场景有名字吗

是的,它被调用(如果我没有弄错的话)

2) 以公平的方式实现这一点的好方法是什么,这样每个订户都有平等的机会获得成分

系统越复杂,就越容易制定解决方案,在这里效果就越好。实现一个循环算法

3) 请注意,优先级不需要固定优先级。如果您在每次活动前掷骰子,您可以每次创建一个顺序。你也可以重新计算。这样的解决方案有什么缺点吗

这个问题在大型可扩展系统和网络中已经存在多年(例如,请参阅)。人们尝试了很多事情,但除非你真的知道自己在做什么,否则就使用一种简单的一次到位的策略


循环制不是完美的,当然也有它自己的缺点,但它也是最简单的解决方案。

1>我不确定这个场景是否有名字

2> 公平是非常主观的。您需要有一个优化标准来获得最佳解决方案。你说每个订户都有同等的机会获得配料。然后你只需要一个统一的随机变量来决定哪一个应该得到它

但你也说过厨师可能不需要特定的配料。因此,只有那些想要当前配料的厨师才需要考虑。因此,你需要有一个加权分布,考虑到所有想要当前配料的厨师之间的公平性

这可以按如下方式进行

假设有X位厨师

所有厨师都从零开始

每一次厨师得到资源,他就得到X分。 所有没有获得资源的厨师都会得到-1分。 因此,分数越高,你在最近的历史中获得的资源就越多。 理想情况下,资源应该分配给得分最少的人

当您有多个人在最少的点上时,只需使用随机均匀分布选择一个人。 这在某种意义上是公平的


另一个选择是仍然允许所有厨师获得资源,但使用一个分布,该分布现在是根据需要资源的厨师的点数总和计算的。这使得它具有随机性,分布由想要获取资源的厨师及其当前历史记录决定

这让我想起了魔兽世界的战利品系统-这也是个不错的比喻!也许我应该澄清资源可能被利用,也可能不被利用。例如,没有一个头脑正常的人会为他们的食谱选芹菜。草稿也是一个不错的类比,但假设您不想让优先级取决于以前的性能。嘿,芹菜只要准备好就可以了(您必须在切片之前“去串”芹菜)。在很多情况下都能很好地工作