我正在创建一个脚本,用于处理用户单击按钮时获胜的百分比。 借助此主题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)
,则用户将有更多获胜机会。我如何处理它,赢/输过程在多个奖品的同一个功能中发生?
答案 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';
}