首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对列表进行加权,以使索引较低的项目更有可能被随机选择?

对列表进行加权,以使索引较低的项目更有可能被随机选择?
EN

Stack Overflow用户
提问于 2018-12-03 00:27:26
回答 1查看 261关注 0票数 1

我收到一个未知大小的List<Fruit>,通常在4-10件之间:

代码语言:javascript
运行
复制
{ Apples, Orange, Pear, ?, ?, ... }  

怎样才能使List的权重达到Apples被选中的最高概率,然后是Orange,然后是Pear

其效果在本质上应该与从List中选择如下所示的随机项相同:

代码语言:javascript
运行
复制
{ Apples, Apples, Apples, Apples, Orange, Orange, Pear }

如果List是固定大小的,我就会

  1. 生成一个在0.0-1.0之间的浮点数;
  2. 如果是< 0.4,返回Apples。否则,如果< 0.75返回Orange等。

请注意,这个问题不是关于selecting a random item from a weighted list的,而是关于对任意长度的现有List进行加权的问题,因为随机选择将导致项目被选择的概率与其在List中的位置成正比。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-03 00:58:09

代码语言:javascript
运行
复制
var weightedItems = myList
    .Select((item, index)
        => new { Item = item, Weight = 1f / Math.Pow(2, index) });

这将给你一个IEnumerable的元组的Item和一个Weight变得越来越小,随着Itemindex增加。

代码语言:javascript
运行
复制
Item = Apples, Weight = 1
Item = Orange, Weight = 0.5
Item = Pear  , Weight = 0.25

等。

显然,您可以根据自己的喜好调整1f / Math.Pow(2, index)部件(计算权重)。我所使用的产品有一个很好的副作用,那就是产生1 >= n > 0,这是一个可预测的范围,并且使每一项被选中的可能性是前一项的一半。

根据您的需求从此结构中选择一个随机项可以如下所示:

  • 生成1到0之间的随机数
  • 将IEnumerable从最低到最高的Weight迭代
  • 返回第一个项目,其中Weight >= your random number
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53585982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档