我有一系列图像。每个图像都有一个“稀有”键,告诉我它是“普通”,“罕见”还是“稀有”。因此,例如,数组可能看起来像这样:
Array
(
[0] => Array
(
[image] => photo1.jpg
[rarity] => common
)
[1] => Array
(
[image] => photo2.jpg
[rarity] => uncommon
)
.
.
.
[x] => Array
(
[image] => photo(x).jpg
[rarity] => rare
)
)
我想从列表中选择“ y”张图片,就像创建一副纸牌一样,但是要有图片。当然,稀有度定义了选择该卡的可能性。我该怎么做呢?我以为我从array_rand()开始,但是在使用它的地方却陷入了困境。
编辑说明:阵列中的每个图像只能在最终卡座中出现一次。
最佳答案
这是我的尝试。在$chances
中,您必须定义选择普通卡,罕见卡或稀有卡以0-100之间的整数形式出现在牌组中的可能性。另外,您还必须提供甲板尺寸。
在卡片唯一且不能在同一副牌中多次出现的地方给出答案:
$cards = array(/* your array from above */);
$deck = array();
$deck_size = 52;
$chances = array('common' => 90, 'uncommon' => 30, 'rare' => 5);
$max_attempts = 3;
$tmp_cards = $cards; // copied
while(count($deck) < $deck_size) {
$roll = rand(0, 100);
for($a = 0; $a < $max_attempts; $a++) {
$index = array_rand($tmp_cards);
$card = $tmp_cards[$index];
$rarity = $card['rarity'];
$image = $card['image'];
if(isset($deck[$image])) {
continue;
}
if($roll <= $chances[$rarity]) {
// if the roll is lower than the required probability
// we can put this card in
$deck[$image] = $card;
unset($tmp_cards[$index]); // delete the card so it's not picked again
break;
}
}
}
$deck = array_values($deck);
更新资料
改进了代码并为所有分支提供了明确的出口。