2011-04-21 4 views
0

나는 여기서하고있는 일에 대해 머리를 감싸는 데 열심히 노력하고있다. 그러나 약간의 어려움이있다 ... 어떤 도움이나 방향이 크게 감사 할 것이다.특정 비율의 기회와 관련된 PHP 변수는 어떻게 선택합니까?

그래서 미리 정의한 배열 (훌륭하게 $ array라고 함)에 따라 추출한 테이블에 일부 값이 있습니다. 이것이 내가 한 일입니다.

foreach ($array as $value) { 

$query = "SELECT * FROM b_table WHERE levelname='$value'"; 
$result = runquery($query); 
$num = mysql_numrows($result); 

$i=0; 
while ($i < 1) { 
[email protected]_result($result,$i,"evochance"); // These values are integers that will add up to 100. So in one example, $evochance would be 60, 15 and 25 if there were 3 values for the 3 $value that were returned. 
$i++; 
} 

이제 어디로 갈 것인가를 알 수 없습니다. $ evochance는 각 $ 값에 링크 된 확률을 나타냅니다. 일부 기능을 통해 유리한 60 %를 선택한 경우 연결된 다른 $ 값을 다른 테이블에 삽입합니다.

는 나는 그것이 도움이되지 않습니다 알고 있지만 내가 생각 해낸 가장이었다 :

if (mt_rand(1,100)<$evochance) { 
$valid = "True"; 
} 
else { 
$valid = "False"; 
} 
echo "$value chance: $evochance ($valid)<br />\n"; // Added just to see the output. 

그럼이 내가 무엇을 찾고 있어요 분명하지 않다. 그리고 나는이 방법으로 역동적 인 비율을 가질 수 없습니다. 또한 두 경우 모두 False를 출력하고 다른 경우에는 True를 출력합니다.

그래서 나는 로프를 배우는 아마추어이고 나는 그것에 가야만했습니다. 어떤 방향으로 환영합니다. 감사합니다 =)


이 ** 편집 3 (정리) : 내 약한 설명에 대 한 미안 해요

@cdburgess; 나는 이것을 이해하려고 노력하고있다. 당신이 그것을 이해할 수 있기를 바랍니다. 내 배열에 무엇의

예 : $array = array('one', 'two', 'three')

글쎄의 위 같은 $array (가 항상하지 않지만 3이 스크립트가 실행될 때마다) 3 개 값이있는 가정 해 봅시다. 특정 필드 ('levelname')에있는 값을 포함하는 테이블의 모든 레코드를 가져오고 있습니다. 이러한 값은 각 레코드마다 고유하므로 값이있는 레코드 수만큼 레코드를 가져옵니다. 이제 해당 테이블의 각 레코드에는 evochance이라는 필드가 있습니다. 해당 필드에는 1에서 100 사이의 단일 숫자가 있습니다. 이전에 쿼리 한 3 개의 레코드 (foreach())는 evochance입니다. 필요한 기능은 'evochance'에 따라 사용할 레코드를 결정합니다. 포함 된 번호. 그것이 99라면,이 스크립트가 실행되는 99 %의 시간 동안 사용되기를 바랍니다.

그러나 ... 단일 숫자에 대해 간단한 가중치 함수가 필요하지 않습니다. n 비율 (n = 배열의 값의 수) 중에서 어떤 비율 = true를 선택해야합니다. 이렇게하면 true로 반환하는 백분율은 levelname과 관련되므로 선택할 수 있습니다 (또는 적어도 내가하려는 것).

또한 명확한 설명을 위해 : 선택한 레코드는 해당 필드 중 하나에 고유 한 정보를 포함합니다 (이는 이전에 테이블을 쿼리 한 $array의 고유 한 값 중 하나입니다). 그런 다음 해당 값으로 다른 테이블 (a_table)을 업데이트하려고합니다.

내 머리를 감쌀 수없는 유일한 방법은 확률 선택 기능입니다 ... 그것은 나에게 상당히 복잡합니다. 그리고 나는 그것에 대해 매우 궁금해 할 것입니다. 다른 방법이 있다면 분명히 시도해 볼 것입니다. 내가받은 대답은 : 나는 지금 그 일을 내리고 내가 할 수있는 일을보고 있습니다.내가 바로 당신을 읽으면 각각의 일부 확률이 선택되고 함께 귀하의 의견을 주셔서 감사합니다 =) **

+1

달성하고자하는 최종 결과는 무엇입니까? 즉,이 코드가 무엇을 성취해야하는지에 대한 높은 수준의 설명. 번호를 저글링하는 경우 단일 쿼리로 데이터베이스에서 똑같은 작업을 수행 할 수 있습니다. – deceze

+0

첫 번째 변경 : 입력을 MySQL로 이스케이프 처리하십시오! –

+0

@Deal 많은 제안 된 변경 사항을 많이 볼 수 있습니다 :) – alex

답변

0

나는 당신이 무엇을 요구하고 있는지 이해하고 있다고 생각합니다. 제가 올바르게 이해한다면, "기회 비율"은 얼마나 자주 기록을 선택해야하는지입니다. 이를 결정하기 위해서는 레코드가 사용될 때마다 값을 증가시켜 레코드가 선택되는 시점을 실제로 추적해야합니다. mt_rand() 또는 rand() 함수는 순서에 있지 않습니다.

정확하게 이해하면 다음과 같이 제안합니다.

<?php 

$value = 'one'; // this can be turned into an array and looped through 
$query1 = "SELECT sum(times_chosen) FROM `b_table` WHERE `levelname` = '$value'"; 
$count = /* result from $query1 */ 
$count = $count + 1; // increment the value for this selection 

// get the list of items by order of percentage chance highest to lowest 
$query2 = "SELECT id, percentage_chance, times_chosen, name FROM `b_table` WHERE `levelname` = '$value' ORDER BY percentage_chance DESC"; 
$records = /* results from query 2 */ 
// percentage_chance INT (.01 to 1) 10% to 100% 
foreach($records as $row) { 
    if(ceil($row['percentage_chance'] * $count) > $row['times_chosen']) { 
     // chose this record to use and increment times_chosen 
     $selected_record = $row['name']; 
     $update_query = "UPDATE `b_table` SET times_chosen = times_chosen + 1 WHERE id = $row['id']"; 
     /* run query against DB */ 
     // exit foreach (stop processing records because the selection is made) 
     break 1; 
    } 
} 

// check here to make sure a record was selected, if not, then take record 1 and use it but 
// don't forget to increment times_chosen 

?> 

이 자체를 설명해야하지만, 간단히 말해서, 먼저 퍼센트의 확률로 가장 높은 우연히 데이터베이스 레코드를 주문 루틴을 말하고있다 : 나는 가독성을 위해 코드를 단순화합니다. 그런 다음 기회 비율이 전체보다 큰 경우에는 건너 뛰고 다음 레코드로 이동하십시오.

UPDATE : 그래서,이 레코드의 집합 주어진 : 시간의 67 %의 시간을 선택한다 1

$records = array(
    1 => array(
     'id' => 1001, 'percentage_chance' => .67, 'name' => 'Function A', 'times_chosen' => 0, 
    ), 
    2 => array(
     'id' => 1002, 'percentage_chance' => .21, 'name' => 'Function A', 'times_chosen' => 0, 
    ), 
    3 => array(
     'id' => 1003, 'percentage_chance' => .12, 'name' => 'Function A', 'times_chosen' => 0, 
    ) 
); 

기록, 기록 시간이 21 %, 및 레코드 3 12 % .

+0

감사합니다. 덕분에 도움이되었습니다. 그것은 내가 원하는 방식으로 더 많든 적든간에 작동합니다. 당신은 스타입니다! – Davi

+0

도와 드리겠습니다! 나는 이해하기 위해 약간의 일을했다. 그러나 나는 마침내 거기에 도착했다라고 생각한다. ;) –

0
$sum = 0; 
$choice = mt_rand(1,100); 
foreach ($array as $item) { 
    $sum += chance($item); // The weight of choosing this item 
    if ($sum >= $choice) { 
     // This is the item we have selected 
    } 
} 

, 당신은 배열에서 항목 중 하나를 선택합니다. 이 방법은 그렇게 할 것입니다. 확률이 100으로 합쳐 졌는지 확인하십시오.

관련 문제