让我们假设:List<element>
哪个元素是:
public class Element {
int Weight { get; set; }
}
我想实现的是,按权重随机选择一个元素。例如:
Element_1.Weight = 100;
Element_2.Weight = 50;
Element_3.Weight = 200;
所以
Element_1
被选中的几率为100/(100+50+200)=28.57%Element_2
被选中的几率为50/(100+50+200)=14.29%Element_3
被选中的几率为200/(100+50+200)=57.14%
我知道我可以创建一个循环,计算总数,等等...
- 我想学习的是,Linq在一行中(或尽可能短)做这件事的最好方法是什么,谢谢。*
更新
我在下面找到了我的答案。我学到的第一件事是:Linq不是魔术,它比设计良好的循环要慢。
所以我的问题变成了找到一个随机元素的重量,(没有尽可能短的东西:)
4条答案
按热度按时间utugiqy61#
如果您想要一个泛型版本(对于与(单一)随机化助手一起使用很有用,请考虑您是否需要一个常量种子)
使用方法:
密码:
nxagd54h2#
sauutmhj3#
这是一个带预计算的快速解,预计算需要
O(n)
,搜索需要O(log(n))
。预先计算:
要生成:
但是,如果列表在每次搜索之间发生变化,则可以改用简单的
O(n)
线性搜索:eivnm1vs4#
这可能行得通:
基本上,对于每个元素,都创建了一个具有最终权重的分区。在您的示例中,元素1将关联到(1--〉100),元素2关联到(101--〉151),依此类推...
然后计算随机权重和,并寻找与之相关的范围。
你也可以在方法组中计算总和,但那会引入另一个副作用...
请注意,我并不是说这是优雅或快速的。但它确实使用了linq(不是在一行中...)