我有一系列图像。每个图像都有一个“稀有”键,告诉我它是“普通”,“罕见”还是“稀有”。因此,例如,数组可能看起来像这样:

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);


更新资料

改进了代码并为所有分支提供了明确的出口。

10-05 21:16