1

我正在制作一个脚本来处理用户单击按钮时获胜的百分比机会。借助本主题php-获胜的机会。我使用了以下代码:

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

这很好用,但是我想处理具有不同获胜机会百分比的多个奖项。

比方说,prize1 有 20% 的中奖机会,prize2 有 30% 的机会,prize3 有 50% 的机会。如果我使用winningChance(20), winningChance(30)winningChance(50)用户将有更多获胜的机会。我该如何处理,赢/输过程发生在多个奖品的同一函数中?

4

4 回答 4

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)));
于 2013-10-14T12:07:24.520 回答
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 ) );
}
于 2014-08-20T05:42:48.357 回答
-1

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

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

根据您的最后评论,这就是您需要的:

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
于 2013-10-14T11:55:21.373 回答
-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';
}
于 2013-10-14T12:11:50.693 回答