2013-10-14 4 views
1

나는 사용자가 버튼을 클릭 할 때 성공 확률을 처리하는 스크립트를 만들고 있습니다. 이 항목의 도움으로 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 데이터베이스에 $resultwinner라는 필드를 등록

그러나 이것은 좋은 작품 우승 확률이 다른 여러 가지 경품을 처리하고 싶습니다.

상품 1이 20 %의 확률을 가지고 있다고 가정하면 상품 2 30 %의 기회 및 상품 3의 50 %의 기회가 주어집니다. winningChance(20)을 사용하는 경우 winningChance(30), winningChance(50) 사용자는 더 많은 기회를 얻게됩니다. 어떻게 처리 할 수 ​​있습니까? 여러 상품에 대해 동일한 기능으로 승/분실 절차가 발생합니까?

+0

당신이 동시에 또는 무작위로 20 %, 30 % 및 50 %를 확인 하시겠습니까? –

+3

왜'global $ result;'입니까? – Carlos

+1

나는 이것을 잘 모른다. 승리 할 수있는 총 기회는 100 %입니까? 또는 1 %의 기회이며, 이기면 x0 %의 상금이 주어진다. – DannyThunder

답변

-1

내가 올바르게 이해했다면, 각 사용자에 대해 서로 독립적으로 여러 개의 우승 계산을하고 싶습니다. 이를 수행 할 수있는 많은 방법이 있습니다. 예를 들어, 연관 배열을 인수로 전달할 수 있도록 함수를 수정하십시오.

배열은 price => percentage 값의 맵이되고 각 쌍에 대한 계산을 수행합니다. 또한 배열에서 결과 변수를 수정해야하며, 각 패스에서 계산 결과를 입력하기 만하면됩니다. 여기에 연관 배열을 사용하여 price => won/lost를 표시 할 수도 있습니다. 모든 쌍을 반복하고 결과 변수를 결과로 채운 후에는 변수 만 반환하십시오.

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 
+0

영어가 내 어머니 가죽 끈이 아니므로 정확하게 설명하기가 어렵습니다. 기본적으로 계산은 동시에 (사용자가 이름/성/메일을 제출할 때) 추가해야하며 3 가지 가격 중 하나만 자신의 확률로 채점해야합니다. –

+0

예를 들어 설명해보십시오. – Shomz

+0

@LorenzoPirondini 이것을 시도하십시오. – Shomz

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

는 같은

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'; 
} 
+1

네, 그게 조용 하긴하지만 좋은 기회 일 가능성이 있습니다. 우리는 세 번째 가격을 얻는 데 첫 50 %의 기회를 가지며, 두 번째를 얻는 데 30 %, 첫 번째 가격에서 20 %를 얻습니다. 그러면 20 % 첫 번째 가격에서 우승 할 확률은 정확합니까 아니면 뭔가 빠졌습니까? –

+0

예 : –

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); 
    } 

편집 : 더 perfomance :

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)); 
} 
+0

으로 정확한 사례를 기입하십시오. 답변을 제공 할 시간을내어 주셔서 감사합니다. 중첩 된 if 문을 작성하는 것보다 정확합니까? 코드 좀 설명해 주시겠습니까? 덕분에 –

+0

나는 더 나은 성능과 더 큰 가독성 논리를 달성하기 위해 함수를 변경했다. – Kirill

+0

감사합니다. –