php 选择 出现列表,php – 如何从加权列表中选择4个唯一项?
所以我有一個(gè)加權(quán)項(xiàng)目列表,我想從這個(gè)列表中選擇4個(gè)非重復(fù)項(xiàng)目.
Item Weight
Apple 5
Banana 7
Cherry 12
...
Orange 8
Pineapple 50
最有效的方法是什么?我最初的嘗試是,如果一個(gè)已經(jīng)被選中的項(xiàng)目出現(xiàn)的話,只需重新選擇隨后的選秀權(quán)……但是對于一個(gè)小名單,這可能會(huì)導(dǎo)致大量的重新加入.
編輯以澄清:
對于上面的例子,忽略水果D到N,總重量為82.所以先被挑選的機(jī)會(huì)是:
約6%
B~8.5%
C~14.6%
O~9.8%
P~61%
一旦選擇了一個(gè)項(xiàng)目,概率就會(huì)(應(yīng)該!)改變.
解決方法:
在你的評論中,你說這是獨(dú)特的意思:
I don’t want to pick the same item twice.
..并且權(quán)重決定了被挑選的可能性.
您需要做的就是確保不挑選重復(fù)項(xiàng),只需從列表中刪除最后一個(gè)選中的項(xiàng)目,然后再選擇下一個(gè)項(xiàng)目.是的,這會(huì)稍微改變您的權(quán)重,但如果您確實(shí)需要獨(dú)特的結(jié)果,那么這是正確的統(tǒng)計(jì)變化.
另外,我不確定你是如何使用權(quán)重來確定候選者的,但我想出了這個(gè)算法,它應(yīng)該用最少的循環(huán)來完成這個(gè)(并且不需要根據(jù)權(quán)重填充數(shù)組,可能導(dǎo)致非常大的數(shù)組,需要int權(quán)重等)
我在這里使用了JavaScript,因此很容易在沒有服務(wù)器的瀏覽器中看到輸出.移植到PHP應(yīng)該是微不足道的,因?yàn)樗鼪]有做任何復(fù)雜的事情.
常量
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);
};
產(chǎn)量
for (var i=0; i < results.length; i++) {
document.write(results[i] + "
");
}
基本策略是為每個(gè)水果分配總范圍[0,1]的一部分.在第一個(gè)循環(huán)中,你有這個(gè):
> 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
該腳本遍歷列表中的每個(gè)項(xiàng)目,并進(jìn)行權(quán)重計(jì)數(shù)器.當(dāng)它到達(dá)包含第一個(gè)隨機(jī)的范圍時(shí),它會(huì)選擇該項(xiàng)目,將其從列表中刪除,然后根據(jù)新的總重量重新計(jì)算范圍并再次運(yùn)行.
標(biāo)簽:php,algorithm,random,list,weighted
來源: https://codeday.me/bug/20190610/1210472.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的php 选择 出现列表,php – 如何从加权列表中选择4个唯一项?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ajax mysql点赞_php+mys
- 下一篇: php判断url参数为空,PHP检查ur