2012-01-05 20 views
0

私はPHPでrand()関数を使ってmysqlデータベースから選択名を生成しようとしています。プログラムは正常に動作しますが、取得するレコードの一部が同じである(セッションをクリアしてもう一度やり直すたびに)一部が選択されない可能性があるため、結果をランダムにすることは可能です。私は現在、テーブルに91レコードあります。PHPで乱数を生成する

if(!isset($_SESSION['max'])){ 
    $max = $db->get_var("SELECT COUNT(*) FROM tbl_participants"); 
    $_SESSION['max'] = $max; 

}else{ 
    $max = $_SESSION['max']; 
} 

if(!empty($_GET['clear'])){ 
    $_SESSION['used_up'] = Array(); 
    $_SESSION['names'] = Array(); 
} 
//print_r($_SESSION['used_up']); 


$current_number = rand(0, $max); 

$exists = check_existing($current_number, $_SESSION['used_up']); 
if($exists == 2){ 
    $_SESSION['used_up'][] = (int)$current_number; 
    $name = $db->get_var("SELECT participant FROM tbl_participants WHERE participant_id='$current_number'"); 
    $_SESSION['names'][] = $name; 

    foreach($_SESSION['names'] as $k=>$v){ 
     echo '<li>'.$v.'</li>'; 
    } 
} 

function check_existing($item, $array){ 
    if(in_array($item, $array)){ 
     return 1; 
    }else{ 
     return 2; 
    } 
} 
+0

最初のエラー:$ current_number = rand(0、$ max); $ current_number = rand(0、$ max-1)である必要があります。またはさらに良い$ current_number = mt_rand(0、$ max-1); –

+0

check_existing()から1と2を返すのではなく、単にブール値TRUEまたはFALSEを返さないのはなぜですか? –

+0

@ MarkBaker:提案をいただきありがとうございます。私は自分のコードを更新します。 – user225269

答えて

2

PHPマニュアルによれば、乱数ジェネレータをシードする必要はありません(少なくともPHP 4.2.0以降)。したがって、PHPスクリプトが実行されるたびに異なる番号が返されるはずです。 mt_rand()も使うことができますが、rand()よりもランダム性が良いとは思いません。このマニュアルでは、rand()がバグだったいくつかの古いlibcのバージョンでは4倍高速であると書かれていますが、それはずっと前に書かれたと思います。

いくつのレコードが必要ですか? SELECT * FROM table ORDER BY rand() LIMIT 5を使用することはできますが、テーブル(1000+)に多数の大きなレコードがある場合は時間がかかることがあります。

91レコードしかない場合は、ジェネレータで同じ番号が再び生成されることがあります。 X個の固有の乱数を生成する方法については、Generating UNIQUE Random Numbers within a range - PHP