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.pswp.cn/news/528892.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/528892.shtml
英文地址,請注明出處:http://en.pswp.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…