2013-07-03 6 views
0

PHP for 루프가 있습니다. 난수를 만듭니다.for 루프에서 임의의 숫자를 반복하지 않으려면 어떻게해야합니까?

for($i = 0; $i < mysql_num_rows($query); $i++) { 
$random = rand(000, 999); 
} 

은 내가 for 결코 임의의 결과를 반복 없다고합니다. for은 999 번 실행되며 나는 결코 for의 결과를 반복하지 않기를 원합니다.

+1

? "무작위"번 반복 하시겠습니까? –

+0

코드에서 'for'는 결과의 수에 따라 실행되며 반드시 999 번이 아닙니다. –

+1

배열에 항목을 추가하고 해당 배열에 항목이 이미 존재하지 않는지 확인합니다. – Dave

답변

3

shuffle() 아마도 최선의 방법입니다 시도하지만, 경우에 어떤 이유로 원하지 않는 PHP.net 좋은 예제가 여기에는 다른 옵션이 있습니다.

$max_value = 999; 
$values = range(0, $max_value); 
$counter = $max_value; 
$num_rows = mysql_num_rows($query); //Best to move this out of the for loop so it doesn't recalculate every time through 
for($i = 0; $i < $num_rows; $i++){ 
    $rand_num = rand(0,$counter); 
    $current_number = $values[$rand_num]; 
    array_splice($values, $rand_num, 1); 
    $counter--; 
    echo "rand number: " . $current_number . '<br>'; 
} 
+0

+1입니다. (상단에있는 for 루프 대신'range (1, 999)'를 사용하십시오.)하지만 이것은 내가 생각한 가장 빠른 것입니다. – bwoebi

+0

입력 한대로 편집하고있었습니다. – Pitchinnate

1
$randomArray = array_rand(range(0, 999), $size = mysql_num_rows($query)); 

for ($i = 0; $i < $size; $i++) { 
    $random = $randomArray[$i]; 
    // ... 
} 
+0

@MichaelBerkowski 이것이 내 의도였습니다. range (0, x)는 0에서 x까지의 키를 가진 배열을 생성합니다. (여기서 key = value). 그래서 난 $ randomArray 값을 반복하지, 무작위로있다. – bwoebi

6

은 내가 for 루프 및 추적 배열을 사용하지 않을 것입니다. 대신 값 범위로 배열을 만들고 임의로 섞으십시오.

$random_numbers = range(0, 999); 
shuffle($random_numbers); 

이제는이 배열의 항목을 고유 한 것으로 보장 할 수 있습니다. 출력을 000, 001 등으로 포맷해야하는 경우 str_pad()을 사용하십시오.

+0

'shuffle()'은 PHP의 일관성없는 동작의 또 다른 예입니다. bool을 반환하고 참조로 전달 된 배열을 변경합니다. – str

+0

+1 좋은 성능 코드를 위해서 –

+0

@str, 바늘과 건초 더미 사이, 건초 더미, 나는 미쳐 가지 않았다는 것에 놀랐다. –

1

글쎄 두 가지 방법이 있습니다. MySQL 쿼리 자체에서이 작업을 수행 할 수 있습니다. 그냥 사용하십시오 :

SELECT ... ORDER BY RAND() 

이것은 가장 빠른 해결책은 아니지만 작동하며 데이터를 반복 할 수 있습니다. 그렇게하고 싶지 않은 경우 다른 솔루션에서 제안하는 것처럼 어레이를 섞어 야합니다. 시간에 따라 임의의 하나 또는 생성 -

0

당신은 엔트로피 수준을 높 아래 코드를

function nonRepeat($min,$max,$count) { 


    if($max - $min < $count) { 
     return false; 
    } 

    $nonrepeatarray = array(); 
    for($i = 0; $i < $count; $i++) { 
     $rand = rand($min,$max); 


     while(in_array($rand,$nonrepeatarray)) { 
     $rand = rand($min,$max); 
     } 

     //add it to the array 
     $nonrepeatarray[$i] = $rand; 
    } 
    return $nonrepeatarray; 
} 
0
$results=new array(); 
for($i = 0; $i < mysql_num_rows($query); $i++){ 
    $random = rand(000, 999); 
    if(!in_array($random,$results) { 
      array_push($results,$random); 
    } 
} 
// you can print_r($results) here if you want 
+0

모든 난수는'$ result'에서 다르게 나타나지만 예상되는 난수보다 적은 수를 생성합니다. –

0

을 찾고 있습니다. 같은

// seed with microseconds 
function make_seed() { 
    list($usec, $sec) = explode(' ', microtime()); 
    return (float) $sec + ((float) $usec * 100000); 
} 
srand(make_seed()); 
$randval = rand(); 
0

뭔가 :

$random_values = array(); 
for($i = 0; $i < mysql_num_rows($query); $i++){ 
    $random = rand(000, 999); 
    while(in_array($random, $random_values)) $random = rand(000, 999); 
     $random_values[] = $random; 
} 
+3

다시 한번 말하면, 내가 잘못 본 것이 아니라면 쉽게 무한 루프가 될 수 있습니다. Qferty에서 Cfr 대답은 –

1

$count = mysql_num_rows($query); 
$randomArray = range(0, $count); 
shuffle($randomArray); 

for ($i = 0, $j = $count; $i < $j; $i++) { 
    $random = array_shift($randomArray); 
} 
관련 문제