Случайное взвешивание монеты в php - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь создать алгоритм броска монеты в php, который будет взвешен на основе суммы, сыгранной на броске монеты.

Например, я хочу, чтобы у пользователя с более высокой ставкой был меньший шанспобеды.При ставке 1 шанс 50/50, но все медленнее становится все меньше и меньше шансов на победу.

Я много перепутал и, похоже, не могу кодировать бросок монеты, чтобы вести себя таким образом.

Это для системы баланса кредитов, которая не имеет значения IRL, то естьиспользуется исключительно для игровых серверов, которые я размещаю.С текущей системой пользователь может легко умножить свой баланс с помощью автоматического кликера, так как это двойное или ничто не отражается.

это то, что я сейчас пытаюсь, но это не так эффективно

<?PHP
$choices = ["heads", "tails","tails", "heads","heads", "tails","heads", "tails", "heads"];
$result = $choices[random_int(0, count($choices)-1)];
$wager = $_GET['wager'];
$win = $wager *2;

if (!is_numeric($wager)) {
    die("You must enter a number for your wager.");
}

if ($wager > $usrdata['money']) {
    die("You don't have enough credits to make this bet.");
}

if ($result  == "tails") {
    if ($_GET['side'] == 0) {
        $newrand = rand(0, $wager);
    }
    $newrandx = rand(0, 1);
    if ($newrandx == 1 && $side == 0) {
        echo '<img src="https://static.pdglobal.app/?sid=files_go&ID=HEADS" />';
    $side = 1;
    } else {
    if ($wager/2 >= $newrand) {
    echo '<img src="https://static.pdglobal.app/?sid=files_go&ID=TAILS" />';
    $side = 0;
    } else {
        echo '<img src="https://static.pdglobal.app/?sid=files_go&ID=HEADS" />';
    $side = 1;

    }
    }
} else {

    if ($_GET['side'] == 1) {
        $newrand = rand(0, $wager);
    }
        $newrandx = rand(0, 1);
    if ($newrandx == 1 && $side == 1) {
        echo '<img src="https://static.pdglobal.app/?sid=files_go&ID=TAILS" />';
    $side = 0;
    } else {
    if ($newrand >= $wager/2) {
    echo '<img src="https://static.pdglobal.app/?sid=files_go&ID=HEADS" />';
    $side = 1;
    } else {
    echo '<img src="https://static.pdglobal.app/?sid=files_go&ID=TAILS" />';
    $side = 0;  

    }
    }
}

if ($side == $_GET['side']) {
    echo '<br/> You won '.$win.' credits!';
    $total = $usrdata['money'] + $win;
    mysql_query("UPDATE account SET money = '".$total."' WHERE username = '".$usrdata['username']."';") or die(mysql_error());
} else {
    echo '<br/> You lost '.$wager.' credits!';
    $total = $usrdata['money'] - $wager;
    mysql_query("UPDATE account SET money = '".$total."' WHERE username = '".$usrdata['username']."';") or die(mysql_error());
    }
?>

Результат должен быть меньше шансов на победу с более высокой ставкой, однако, кажется, все ещебыть точным шансом 50/50 даже с написанным мною кодом.

1 Ответ

0 голосов
/ 21 сентября 2019

это похоже на мои потребности

<?PHP
$wager = $_GET['wager'];
$win = $wager *2;

if ($wager < 10) {
    die("You must wager at least 10 credits."); 
}

if ($_GET['side'] == 0) {
$values[0] = 0;
$weights[0] = 5;    
$values[1] = 1;
$weights[1] = $wager*2; 
} else {
    $values[0] = 0;
$weights[0] = $wager*2; 
$values[1] = 1;
$weights[1] = 5;    

}

$side = weighted_random_simple($values, $weights);


if (!is_numeric($wager)) {
    die("You must enter a number for your wager.");
}

if ($wager > $usrdata['money']) {
    die("You don't have enough credits to make this bet.");
}

if ($side  == 0) {
    echo '<img src="https://static.pdglobal.app/?sid=files_go&ID=TAILS" />';
} else {
echo '<img src="https://static.pdglobal.app/?sid=files_go&ID=HEADS" />';
}

if ($side == $_GET['side']) {
    echo '<br/> You won '.$win.' credits!';
    $total = $usrdata['money'] + $win;
    mysql_query("UPDATE account SET money = '".$total."' WHERE username = '".$usrdata['username']."';") or die(mysql_error());
} else {
    echo '<br/> You lost '.$wager.' credits!';
    $total = $usrdata['money'] - $wager;
    mysql_query("UPDATE account SET money = '".$total."' WHERE username = '".$usrdata['username']."';") or die(mysql_error());
    }

    function weighted_random_simple($values, $weights){ 
    $count = count($values); 
    $i = 0; 
    $n = 0; 
    $num = mt_rand(1, array_sum($weights)); 
    while($i < $count){
        $n += $weights[$i]; 
        if($n >= $num){
            break; 
        }
        $i++; 
    } 
    return $values[$i]; 
}
?>
...