所以我有一个加权项目列表,我想从这个列表中选择4个非重复项目.

Item Weight

Apple 5

Banana 7

Cherry 12

...

Orange 8

Pineapple 50

最有效的方法是什么?我最初的尝试是,如果一个已经被选中的项目出现的话,只需重新选择随后的选秀权……但是对于一个小名单,这可能会导致大量的重新加入.

编辑以澄清:

对于上面的例子,忽略水果D到N,总重量为82.所以先被挑选的机会是:

约6%

B~8.5%

C~14.6%

O~9.8%

P~61%

一旦选择了一个项目,概率就会(应该!)改变.

解决方法:

在你的评论中,你说这是独特的意思:

I don’t want to pick the same item twice.

..并且权重决定了被挑选的可能性.

您需要做的就是确保不挑选重复项,只需从列表中删除最后一个选中的项目,然后再选择下一个项目.是的,这会稍微改变您的权重,但如果您确实需要独特的结果,那么这是正确的统计变化.

另外,我不确定你是如何使用权重来确定候选者的,但我想出了这个算法,它应该用最少的循环来完成这个(并且不需要根据权重填充数组,可能导致非常大的数组,需要int权重等)

我在这里使用了JavaScript,因此很容易在没有服务器的浏览器中看到输出.移植到PHP应该是微不足道的,因为它没有做任何复杂的事情.

常量

var FRUITS = [

{name : "Apple", weight: 8 },

{name : "Orange", weight: 4 },

{name : "Banana", weight: 4 },

{name : "Nectarine", weight: 3 },

{name : "Kiwi", weight: 1 }

];

var PICKS = 3;

function getNewFruitsAvailable(fruits, removeFruit) {

var newFruits = [];

for (var idx in fruits) {

if (fruits[idx].name != removeFruit) {

newFruits.push(fruits[idx]);

}

}

return newFruits;

}

脚本

var results = [];

var candidateFruits = FRUITS;

for (var i=0; i < PICKS; i++) {

// CALCULATE TOTAL WEIGHT OF AVAILABLE FRUITS

var totalweight = 0;

for (var idx in candidateFruits) {

totalweight += candidateFruits[idx].weight;

}

console.log("Total weight: " + totalweight);

var rand = Math.random();

console.log("Random: " + rand);

// ITERATE THROUGH FRUITS AND PICK THE ONE THAT MATCHES THE RANDOM

var weightinc = 0;

for (idx in candidateFruits) {

// INCREMENT THE WEIGHT BY THE NEXT FRUIT'S WEIGHT

var candidate = candidateFruits[idx];

weightinc += candidate.weight;

// IF rand IS BETWEEN LAST WEIGHT AND NEXT WEIGHT, PICK THIS FRUIT

if (rand < weightinc/totalweight) {

results.push(candidate.name);

console.log("Pick: " + candidate.name);

// GET NEXT SET OF FRUITS (REMOVING PICKED FRUIT)

candidateFruits = getNewFruitsAvailable(candidateFruits, candidate.name);

break;

}

}

console.log("CandidateFruits: " + candidateFruits.length);

};

产量

for (var i=0; i < results.length; i++) {

document.write(results[i] + "
");

}

基本策略是为每个水果分配总范围[0,1]的一部分.在第一个循环中,你有这个:

> Apple – 8/20 = 0.0最高0.4

>橙色 – 4/20 = 0.4至0.6

>香蕉 – 4/20 = 0.6至0.8

>油桃 – 3/20 = 0.8至0.95

> Kiwi – 8/20 = 0.95至1.0

该脚本遍历列表中的每个项目,并进行权重计数器.当它到达包含第一个随机的范围时,它会选择该项目,将其从列表中删除,然后根据新的总重量重新计算范围并再次运行.

标签:php,algorithm,random,list,weighted

来源: https://codeday.me/bug/20190610/1210472.html

php 选择 出现列表,php – 如何从加权列表中选择4个唯一项?相关推荐

  1. mysql里面的选择运算_在MySQL关系模型中,选择运算是在一个关系的所有元组中选择指定属性列,组成新关系。...

    [单选题]下列关于元素第一电离能的说法不正确的是( ) [填空题]We had already ____ contact with the museum. [判断题]DELETE语句功能是对表中所有记 ...

  2. excel按条件选择工作表_在Excel工作表中选择“实际使用范围”

    excel按条件选择工作表 It's easy to select the current range in Excel – just press Ctrl + A. That shortcut se ...

  3. Java“双色球”每注投注号码由 6 个红色球号码和 1 个蓝色球号码 组成。红色球号码从 1—33 中选择,蓝色球号码从 1—16 中选择。 球的数字匹配数量和颜色决定了是否中奖,具体中奖规则:

    package com.zx;import java.util.Random; import java.util.Scanner;/*** @author CaesarChang* @data 202 ...

  4. 双色球(投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1—33中选择;蓝色球号码从1—16中选择。)

    package train1;import java.util.Random; import java.util.Scanner;public class test3 {public static v ...

  5. PyCharm入门教程——在编辑器中选择文本

    PyCharm最新版本下载 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具.此外,该IDE提供了一些高级功能,以用于 ...

  6. 初学者python编辑器选pycharm_PyCharm入门教程——在编辑器中选择文本|python基础教程|python入门|python教程...

    选择文本的基本方法是用鼠标光标扩展选择.PyCharm作为一个以键盘为中心的IDE,建议使用导航键进行选择. 您可以选择选择文本片段,或在列模式下选择矩形片段,扩展和收缩选择,使用多重选择和粘性选择. ...

  7. vue列表长度限定_游戏设计中的中英文名称可输入/显示长度规范探究

    大家好,我是游戏交互设计师懒蚂蚁GM~ 我们刚接触一款新游戏时,一般都会创建一个让自己满意的游戏角色,然后将自己的情感和行为映射到这个角色身上,以这个角色的身份去和虚拟的游戏世界进行互动.那么,我们在 ...

  8. mysql 的条件 if else_使用If else条件在mysql中选择列?

    我有两张桌子,分别是桌子 AccountNo User Name ---------------------------------- 1 U a 2 U b 3 U c 另一个表包含以下结构 Tem ...

  9. jQuery Autocomplete 用户快速找到并从预设值列表中选择

    jQuery Autocomplete 插件根据用户输入值进行搜索和过滤,让用户快速找到并从预设值列表中选择.通过给 Autocomplete 字段焦点或者在其中输入字符,插件开始搜索匹配的条目并显示 ...

最新文章

  1. 从头开始学JavaScript (五)——操作符(二)
  2. 公式没有编号_知乎公式编辑器的一些小技巧 amp; 使用规范
  3. 「3」Java开发环境搭建
  4. 通过 IDE/Maven 部署 Serverless 应用实践
  5. VTK:Filtering之VectorFieldNonZeroExtraction
  6. 计算机与采集卡无法通信,通信工程毕业设计(论文)-基于.NET平台的高速图像采集.doc...
  7. Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理?
  8. MySQL查询,按拼音首字母排序
  9. 6-1 稀疏矩阵求和 (70 分)
  10. oracle 调用java 类_oracle数据库PL SQL调用Java类程序代码
  11. jquery 筛选不到 checkbox, radio 表单元素
  12. hadoop面试题汇总
  13. 《熊出没原始时代》总导演丁亮:爱与勇气 穿越古今
  14. android炫酷的动画效果
  15. B.系数 (Lucas定理)
  16. _snprintf_s
  17. 关于正确处理0x80070426等错误的方法
  18. Redis geo计算距离
  19. MySQL数据库软件安装
  20. 英语面试常见问题集锦 .

热门文章

  1. 说真的,程序员相亲,真的太太太太太太难了 | IT巨能唠
  2. 牛顿迭代法c 语言程序,牛顿迭代法 c语言实现
  3. android 创建文件夹_Android 动画小记
  4. 电脑word在哪_word是什么?小学生:单词,大学生:论文排版工具
  5. android 浏览器 pc一样大小,手机端不同浏览器[主流的,包括Android自带]对cookie的不同限制,如个数和大小,如何查看?...
  6. 优化if-else代码的八种方案!
  7. java.net.BindException: Address already in use: connect
  8. 大家常用的 IDEA 插件大推荐,个个都得安装!
  9. 软件设计师 - 数据流图
  10. @Transactional 事务失效记录