簡體   English   中英

我如何保證選擇加權元素?

[英]How can I guarantee pick a weighted element?

有人可以幫我嗎,我正在嘗試制作一個簡單的 javascript 游戲,讓用戶根據其重量選擇一個隨機元素。 問題是,我很難獲得數組中權重最低的元素,所以,我意識到為什么不進行最大數量的選擇,然后達到最大數量,您將保證獲得最低權重元素。 (我很抱歉我的英語,因為它不是我的第一語言)。 我也是 javascript 的初學者。 >///<

這是代碼:

var firstPrize = 
[
        "200k Yen Cash",
        "High End Computer Set"
]; //first prize with 0.5% chance of getting picked

var secondPrize = 
[
        "Xbox",
        "PS5",
        "Nintendo Switch"
]; //second prize with 25.3% chance of getting picked

var thirdPrize = 
[
        "10k Yen Cash",
        "10k Yen Amazon Voucher",
        "Airpods",
        "Customized Keyboard",
        "1-Yr Nitro Boost",
        "Shoes"
]; //third prize with 74.2% chance of getting picked

var randFirstPrize = firstPrize[Math.floor(Math.random() * firstPrize.length)]; // random pick

var randSecondPrize = secondPrize[Math.floor(Math.random() * secondPrize.length)]; // random pick

var randThirdPrize = thirdPrize[Math.floor(Math.random() * thirdPrize.length)]; // random pick

const prizes = 
[
        randFirstPrize,
        randSecondPrize,
        randThirdPrize
]; // prizes as variables

const weights =
[
        0.5,
        25.3,
        74.2
]; //prize percent chance

function userPrize(prizes, weights) {
    var i;
  
    for (i = 0; i < weights.length; i++)
    weights[i] += weights[i - 1] || 0;
    
    var random = Math.random() * weights[weights.length - 1];
    
    for (i = 0; i < weights.length; i++)
        if (weights[i] > random)
            break;
    
    return prizes[i];
}; //pick random weighted elements

console.log(userPrize(prizes, weights));

由於權重高於其他獎項,預計thirdPrize將主要是三等獎。 所以我的目標是,當玩家達到 150 次選擇/累積時,他將保證選擇firstPrize 希望我能很好地解釋我的問題。

我假設您發布的代碼當前按預期工作,並且您想添加 function “當玩家達到 150 次選擇/累積時,他將保證選擇 randFirstPrize”。

為此,您將需要一個變量來跟蹤他們選擇了多少次:

let pickTimes = 0;

每次用戶選擇時,您都需要添加它:

    // ...
    pickTimes++;
    return prizes[i];

現在,顯然您可以在每次選擇隨機獎品時檢查pickTimes變量。 這取決於您如何處理它,但這是一個建議:

    var random = Math.random() * weights[weights.length - 1];
    
    if (pickTimes == 150) {
        random = 100; // So your weight for first prize always meets the first prize condition
        pickTimes = 0; // You may want to reset the pick times so 150 times later users can still get guaranteed first prize.
    }

ps經過更徹底的閱讀,我不明白你的取重代碼。 我可能錯了,但是如果出現問題,您應該在修復代碼后從我上面解釋的邏輯中了解如何應用它的原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM