You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带权重(Luck)机制的PHP图片随机器开发及JS代码转译问询

Weighted Image Randomizer in PHP (With Rarity Control)

Absolutely! PHP is way more flexible for building this weighted image randomizer than that JavaScript version stuck with a max Luck value of 10. Let’s walk through how to port that weighted logic over, tune the rarity exactly how you want it, and avoid those annoying frequent super-rare spawns.

First, Let’s Recap the Core Idea

The JavaScript version uses a "Luck" value to weight each image’s chance of being selected. In PHP, we can replicate this logic but with no upper limit on those Luck values—so you can fine-tune rarity as precisely as you want.

Step 1: Replace Unweighted Code with Weighted Data

First, swap out that basic unweighted image array for one that includes custom Luck (weight) values. Here’s an example tailored to your request: rare images (including super-rare) make up ~70% of selections, super-rares are rare enough to avoid spamming, and commons fill the rest:

// Define your images with custom Luck weights (no upper limit!)
$weightedImages = [
    ['url' => 'common.jpg', 'luck' => 30],    // 30% chance (common)
    ['url' => 'rare.jpg', 'luck' => 65],       // 65% chance (rare)
    ['url' => 'super_rare.jpg', 'luck' => 5]   // 5% chance (super-rare)
];

Step 2: The Weighted Selection Logic

This code calculates the total weight, generates a random number, and finds which image’s weight interval the number falls into—this is the core of the weighted randomization:

function getWeightedRandomImage($weightedImages) {
    // Calculate total Luck across all images
    $totalLuck = array_sum(array_column($weightedImages, 'luck'));
    
    // Generate a random number between 0 and total Luck
    $randomNumber = mt_rand(0, $totalLuck);
    
    $currentWeightSum = 0;
    $selectedImage = null;
    
    // Loop through each image to find the matching weight interval
    foreach ($weightedImages as $image) {
        $currentWeightSum += $image['luck'];
        if ($randomNumber <= $currentWeightSum) {
            $selectedImage = $image['url'];
            break;
        }
    }
    
    // Fallback to the first image if something goes wrong (edge case)
    return $selectedImage ?? $weightedImages[0]['url'];
}

// Use the function to get your random image
$selectedImage = getWeightedRandomImage($weightedImages);

// Output the image (adjust this to fit your use case)
echo "<img src='$selectedImage' alt='Random Weighted Image'>";

Step 3: Avoid Frequent Super-Rare Spawns

If you want to go beyond just probability and prevent back-to-back super-rare images, add a simple history check (store this in a session to persist across page loads):

session_start();

// Initialize history if it doesn't exist
if (!isset($_SESSION['image_selection_history'])) {
    $_SESSION['image_selection_history'] = [];
}

function getWeightedRandomImageWithAntiSpam($weightedImages, &$history) {
    $maxAttempts = 10; // Prevent infinite loops in edge cases
    $attempt = 0;
    $superRareUrl = 'super_rare.jpg'; // Define your super-rare image URL
    
    while ($attempt < $maxAttempts) {
        $selected = getWeightedRandomImage($weightedImages);
        
        // Check if we're trying to select super-rare and it was the last selection
        if ($selected === $superRareUrl && !empty($history) && end($history) === $superRareUrl) {
            $attempt++;
            continue;
        }
        
        // Update the history (keep only the last selection to check for repeats)
        array_push($history, $selected);
        if (count($history) > 1) {
            array_shift($history);
        }
        
        return $selected;
    }
    
    // If all attempts fail, fall back to a common image
    return 'common.jpg';
}

// Get your spam-protected random image
$selectedImage = getWeightedRandomImageWithAntiSpam($weightedImages, $_SESSION['image_selection_history']);
echo "<img src='$selectedImage' alt='Spam-Protected Weighted Image'>";

Why This Works Better Than the JS Version

  • No Luck Value Limits: Unlike the JS code capped at 10, you can use any integer (or adjust the code to support floating-point values for ultra-precise rarity).
  • Tunable Rarity: Just tweak the luck values to get exactly the probabilities you want—70% rare, 5% super-rare, whatever fits your needs.
  • Flexible Anti-Spam: The history check is easy to adjust (e.g., block super-rares from appearing in the last 2 selections instead of just 1).

内容的提问来源于stack exchange,提问作者 Projectile Vomiting

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:39:24