赢得多个奖项的百分比机会

时间:2013-10-14 11:39:08

标签: php

我正在创建一个脚本,用于处理用户单击按钮时获胜的百分比。 借助此主题php - Chance of winning。我使用了以下代码:

function winningChance($percentage) {
    if($percentage < 1 || $percentage > 100) throw new Exception('Invalid percentage');
    global $result;
    if(rand(1, 100) <= $percentage) {
        $result = 'won';
    } else {
        $result = 'lost';
    }
    return $result;
}

echo "you have ".winningChance(50).'!'; 

此脚本运行后,它会在SQL数据库中注册用户名/姓氏/电子邮件以及名为winner$result的字段

这很有效,但是我想处理多个获奖机会不同百分比的奖品。

让我们说获奖1有20%的机会获胜, 获得2%30%的机会 和奖金5%的几率。 如果我使用winningChance(20)winningChance(30)winningChance(50),则用户将有更多获胜机会。我如何处理它,赢/输过程在多个奖品的同一个功能中发生?

4 个答案:

答案 0 :(得分:0)

如果我理解正确,获胜的机会取决于价格。

function getChanceOfWinning($price)
{
  $chances = array(
    10 => 20,
    20 => 30,
    30 => 50
  );
  if (isset($chances[$price])) {
    return $chances[$price];
  }
  return 0; // <-- default chance
}

function calculateWinningChance($price)
{
  $chance = getChanceOfWinning($price);
  $calc   = rand(1, 100);

  if ($calc <= $chance) {
    return true;
  }
  return false;
}

function calculateWinningChances(array $prices)
{
  $results = array();
  foreach($prices as $price) {
    $results[$price] = calculateWinningChance($price);
  }
  return $results;
}

var_dump(calculateWinningChances(array(10,20, 30,40,700)));

答案 1 :(得分:0)

这个解决方案怎么样?

function roll( $iChance ) {
        $iCursor = rand( 0,99 );
        $aModel = array();
        while ( count( $aModel ) != $iChance ) {
            $iRandValue = rand( 0,99 );
            if ( !in_array( $iRandValue, $aModel ) ) {
                $aModel[] = $iRandValue;
            }
        }
        return in_array( $iCursor, $aModel );
    }

修改:提高效果:

function roll( $iChance ) {
    $iChance = ceil( ( $iChance > 100 ) ? 100 : (int)$iChance);
    $iCursor = rand( 0, 99 );
    $aModel = range( 0, 99 );
    shuffle( $aModel );
    return in_array( $iCursor, array_slice( $aModel, 0, $iChance ) );
}

答案 2 :(得分:-1)

如果我理解正确,您希望每个用户同时拥有多个获胜计算,彼此独立。有很多方法可以做到这一点。修改您的函数,以便您可以将关联数组作为参数传递,例如。

数组将是price =&gt;百分比值的映射,然后对每对进行计算。 您还需要在数组中修改结果变量,并且在每次传递时只需将计算结果推入其中。您还可以在此处使用关联数组来显示price =&gt;赢/输。循环遍历所有对并用结果填充结果变量后,只需返回变量。

根据您的上一条评论,这就是您所需要的:

function winningChance($percentage) {
    foreach($percentage as $p) {
        if($p < 1 || $p > 100) 
            throw new Exception('Invalid percentage');
    }
    if (count($percentage) != 3)
        throw new Exception('Three prizes need to be defined');

    $rand = rand(1, 100); // generate the random chance only once!

    if ($rand <= $percentage[0])
        $result = 'won first prize';
    elseif ($rand <= $percentage[1])
        $result = 'won second prize';
    elseif ($rand <= $percentage[2])
        $result = 'won third prize';
    else
        $result = 'lost';

    return $result;
}

并调用这样的函数:

//the array contains probability percentages for the first, second and third place respectively
$res = winningChance( array(20, 30, 50) );
echo "You have $res!";
// write $res to the db here

答案 3 :(得分:-1)

调整你的功能代码,如

instead of,

if(rand(1, 100) <= $percentage) {
    $result = 'won';
} else {
    $result = 'lost';
}

要,

if(rand(1, 100) >= 50) {
    $result = 'won third price';
} else if(rand(1, 100) >= 30) {
    $result = 'won second price';
}
else if(rand(1, 100) >= 20) {
    $result = 'won first price';
}
else
{
    $result='lost';
}