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

所以我有一个加权项目列表,我想从这个列表中选择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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安徽关节式焊接机器人_上下料机器人的重要性体现在哪里?它有哪些优势?

上下料机器人是工业机器人家族中从事加工应用的重要成员之一&#xff0c;能满足“快速、大批量加工节拍”、“节省人力成本”、“提高生产效率”等要求&#xff0c;成为越来越多中心企业的理想选择。那么&#xff0c;上下料机器人有哪些特征和优势&#xff1f;企业主应该如何选…

oracle查询ora03114,求教:ora-03114错误从哪里排查?

ERP软件偶尔会报 ora-03114错误 未连接到oracle我检查数据库的根超时有关的设置dba_profiles中的如下两个参数&#xff0c;都是不限制connect_timeunlimitedidle_timeunlimitedsqlnet.net中&#xff0c;只设置了如下参数SQLNET.EXPIRE_TIME5 --这个用来清除僵死连接的监听日志文…

python大学什么专业学校_好学校的差专业和一般大学的好专业,该怎么选?我来说真话……...

假如是985&#xff0c;那么只能调剂专业&#xff0c;那么好点211能选到不错的专业。那该怎么选择&#xff1f;其实不单单是985/211的问题&#xff0c;是所有考生的任何一个分数都面临这个问题。比如清华北大被调剂&#xff0c;是去复交金融&#xff0c;还是去清华北大调剂去学环…

oracle查询表nextval,Oracle Database 建立与查询 Sequence

相关的 Oracle Database Sequence 资讯如下&#xff1a;建立 Sequence 语法create sequence ._sincrement by 1start with 1maxvalue 99999999999999999999minvalue 1nocycle;其中 :incerment: 每次增加的数值start : Sequence 开始数值maxvalue : Sequence 最大值nocycle …

vision软件_Roboguide软件:高速拾取仿真工作站相机与工具添加与配置

上一期为大家介绍了机器人高速拾取仿真工作站中工件、视觉校准板、输送带等外围设备的添加与配置&#xff0c;本期再来为大家介绍一下相机、机器人工具的添加与配置。一、相机添加与配置1.左侧浏览树中右击“Sensor Units”&#xff0c;在弹出的快捷菜单中依次点击“Add Sensor…

oracle00333,Oracle数据库REDO损坏ora-00333修复手札

1.事情起因接到电话&#xff0c;周日意外断电&#xff0c;数据库起不了&#xff0c;报REDO CRASH,ora-00333错误。相关环境如下&#xff1a;RAC oracle_11.2.0.3&#xff0c;无备份&#xff0c;开归档。2 处理一到现场&#xff0c;既然对方没有备份&#xff0c;那就做一个冷备份…

oracle cannot allocate new log,Thread 1 cannot allocate new log

今天发现alter.log有以下信息&#xff1a;Thread 1 cannot allocate new log, sequence 6166Private strand flush not complete对于这个错误信息得解释如下&#xff1a;当系统要重新利用某个日志文件的时候&#xff0c;系统需要将该日志文件所包括的buffer cache 中的dirty bl…

arduino tft 方向_ESP32在Arduino环境下玩转 LVGL,ESP32移植LVGL详细教程

微信关注 “DLGG创客DIY”设为“星标”&#xff0c;重磅干货&#xff0c;第一时间送达。❝转载自慕容流年 https://me.csdn.net/qq_41868901❞1. LVGL简介LittlevGL是一个免费的开源图形库&#xff0c;提供了创建嵌入式GUI所需的一切&#xff0c;具有易于使用的图形元素、漂亮的…

linux内核开文件系统,内核必须懂(二): Linux文件系统初探

目录前言文件系统结构新建文件和inode文件创建过程inode解析打开文件参考最后前言这次来说文件系统. 文件系统是非常重要的, 提高磁盘使用率, 减小磁盘磨损等等都是文件系统要解决的问题. 市面上的文件系统也是数不胜数, 比较常用的像ext4, xfs以及ntfs等等, 国内的像鹅厂的tfs…

gps卫星位置计算程序matlab_科研项目 | BD/ GPS卫星导航仿真测试系统研究

一、项目背景在移动互联和互联网的时代&#xff0c;卫星导航定位已经成为生活中不可或缺的部分。目前&#xff0c;我国的交通、银行、电力、采矿、测绘等部门以及大众化市场都需要大量的定位、授时服务。许多企业也形成了覆盖卫星导航相关材料及元器件、卫星导航芯片、卫星导航…

linux docker权限,linux - 如何解决ubuntu中的docker权限问题? - Ubuntu问答

问题描述我已经按照here的说明安装了docker。我使用Ubuntu Trusty 14.04 (LTS) (64-bit)。安装过程中的一切都很好。另外&#xff0c;命令$ sudo docker run -i -t ubuntu /bin/bash可以很好地完成(在打开的控制台中键入”exit”之后。但是当我尝试执行其他操作时&#xff0c;我…

python虚拟人脸生成_GitHub - 597111463/seeprettyface-generator-yellow: 这是一个用StyleGAN训练出的黄种人人脸生成器...

黄种人人脸生成器注明&#xff1a;之前做的一些有意思的人脸生成器&#xff0c;现在全部开源分享出来。它的主要作用是可生成制作各类型的人脸素材&#xff0c;供我们任意使用且无须担心人脸版权的问题。在定制人脸上&#xff0c;开源的全系列生成器包括&#xff1a;黄种人脸生…

Linux输入密码接口,Linux下搭建接口自动化测试平台

前言我们今天来学习一下在Linux下如何搭建基于HttpRunner开发的接口自动化测试平台吧&#xff01;需要在Linux上提前准备的环境(下面是本人搭建时的环境)&#xff1a;1&#xff0c;Python 3.6.8 (可参考随笔&#xff1a;Linux学习6-安装Python3.6)2&#xff0c;MySQL 5.7(可参考…

python构建字典实现英文大写字母与ascii编码的转换_Python:将复杂的字符串字典从Unicode转换为ASCII...

作为从JSON API调用解析的多级字典,我有很多输入.字符串都是unicode,这意味着有很多ustuff like this.我正在使用jq来处理结果,需要将这些结果转换为ASCII.我知道我可以编写一个函数来像这样转换它:def convert(input):if isinstance(input, dict):ret {}for stuff in input:r…

linux下查看windows文件夹大小,如何从Windows命令行检查文件夹的大小?

我意识到这个问题要求使用进行文件大小分析CMD line。但是&#xff0c;如果您愿意使用它&#xff0c;PowerQuery (Excel add-in, versions 2010)则可以创建一些非常引人注目的文件大小分析。下面的脚本可以粘贴到空白查询中&#xff1b;您唯一需要做的就是添加一个名为“ param…

python多进程传递参数_急急急, Python 多进程,如何传递 epoll?

102019-06-16 15:39:41 08:00NoAnyLove 好的好的&#xff0c;我查了下&#xff0c;说 IPC 或向 worker 参数传递的东西必须要能 pickle&#xff0c;不然就报错&#xff0c;那就是 select.epoll 是不支持的。error&#xff1a;TypeError: cant pickle select.epoll objects。代码…

linux查看一小时之内的日志,linux – 在[timespan]内(例如最后一小时)查找日志文件中的条目...

我的服务器CPU使用率不高&#xff0c;我可以看到Apache正在使用太多的内存。我有一种感觉&#xff0c;我正在用一个IP进行DOS.-也许你可以帮我找到他&#xff1f;我已经使用以下行找到10个最“活跃”的IP&#xff1a;cat access.log | awk {print $1} |sort |uniq -c |sort -n …

图像语义分割_图像语义分割(9)-DeepLabV3: 再次思考用于图像语义分割的空洞卷积...

论文地址 &#xff1a;Rethinking Atrous Convolution for Semantic Image Segmentation论文代码&#xff1a;Github链接1. 摘要文章主要的工作&#xff1a;使用空洞卷积来调整滤波器的感受野并控制特征图分辨率使用不同空洞率的空洞卷积的串联或者并行操作来分割不同尺度的目标…

linux系统列表,Linux常用系统调用列表-20210415054405.docx-原创力文档

LinuxLinux常用系统调用列表作者&#xff1a;雷震 2002年3月本文列出了大部分常见的Linux系统调用&#xff0c;并附有简要中文说明。以下是Linux系统调用的一个列表&#xff0c;包含了大部分常用系统调用和由系统调用派 生出的的函数。按照惯例&#xff0c;这个列表以man pages…

sql replace 双引号变单引号_sql-汇总、排序以及分析思路

一、汇总函数注&#xff1a;汇总函数&#xff0c;如果输入是列名&#xff0c;计算会把null 排除在外&#xff0c;count(*)对所有的行进行计数二、如何用sql解决业务问题注1&#xff1a;空值(null)的排序,排序是最小的&#xff0c;例如select * from tea order by tea_name注2&a…