2017-09-07 19 views
3

운영자에 대한 알림 : 이것은 숙제가 아닙니다.PHP : 동일한 확률로 변수에 값을 분산하는 방법은 무엇입니까?

$points = 10; 
$a = 0; 
$b = 0; 
$c = 0; 
$d = 0; 

나는 무작위로 포인트가 제로에 도달 $까지 ($ A, $ B를, $의 C, $ d 개) 변수에 포인트를 배포 할 :

나는 다음 예제를 가지고있다. 그래서, 일부 기능/스크립트를 실행 한 후 예상 임의의 출력은, 다음과 같이

$points = 0;// Must be zero 
$a = 3; 
$b = 1; 
$c = 0; 
$d = 6; 

을 나는 다음은 간단한 솔루션,하고 생각 해요 :

while($points > 0) { 
    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    $a += $points_taken; 

    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    $b += $points_taken; 

    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    $c += $points_taken; 

    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    $d += $points_taken; 
} 

기능은 한 문제가를 : $ a는 목록에서 처음이기 때문에 더 많은 포인트 (또는 모든 포인트)를 얻을 수있는 기회가 훨씬 더 높습니다. $ d는 목록에서 마지막이기 때문에 더 적은 포인트 (또는 전혀 포인트가없는)를 취할 확률이 훨씬 높습니다 .

질문 : 모든 변수에 동일한 배분 기회를 부여하려면 어떻게합니까?

참고 : 변수 중 하나가 모든 점을 취한다면 괜찮습니다.

+0

배열 내에서 작동하며 http://php.net/array_rand를 확인하십시오. – Calimero

+0

끝에 $ points를 0으로 설정해야합니까? – Manav

+0

@Manav 꼭 그렇지는 않겠지 만, 10 점 만점으로 배포 해 드리겠습니다. – evilReiko

답변

2

범위에서 변수 중 하나를 임의로 선택하여 변수 변수를 사용하여 할당 할 수 있습니다.

$vars = range('a','d'); 
while ($points) { 
    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    ${$vars[mt_rand(0, 3)]} += $points_taken; 
} 
1

이와 비슷한?

$points = 10; 
    $a = 0; 
    $b = 0; 
    $c = 0; 
    $d = 0; 
    for($i=0; $i<$points; $i++) { 
     $rand = rand(1,4); 
     if($rand == 1) { 
      $a++; 
     } else if ($rand == 2) { 
      $b++; 
     } else if ($rand == 3) { 
      $c++; 
     } else if ($rand == 4) { 
      $d++; 
     } 
    } 
+0

나는 대답을 좋아합니다. 하지만 $ 10000과 같이 큰 숫자라면 10000 번 반복해야합니다. – evilReiko

+0

아, 저기 있습니다. – Manav