php中的随机数生成

php中的随机数生成,php,Php,我试图使用php中的rand()函数从mysql数据库生成select名称。该程序运行良好,但是否有可能使结果更加随机,因为我得到的某些记录是相同的(每当我清除会话并重新开始时),而其他记录可能不会被选中。我目前在表中有91条记录 if(!isset($_SESSION['max'])){ $max = $db->get_var("SELECT COUNT(*) FROM tbl_participants"); $_SESSION['max'] = $max; }else

我试图使用php中的rand()函数从mysql数据库生成select名称。该程序运行良好,但是否有可能使结果更加随机,因为我得到的某些记录是相同的(每当我清除会话并重新开始时),而其他记录可能不会被选中。我目前在表中有91条记录

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;
    }
}
if(!isset($\u会话['max'])){
$max=$db->get_var(“从tbl_参与者中选择计数(*));
$\会话['max']=$max;
}否则{
$max=$\会话['max'];
}
如果(!empty($_GET['clear'])){
$\u会话['used\u up']=Array();
$\u会话['names']=Array();
}
//打印($_会话['used_up']);
$current_number=rand(0,$max);
$exists=检查现有($current\u number,$\u SESSION['used\u up']);
如果($exists==2){
$\u会话['used\u up'][]=(int)$当前\u编号;
$name=$db->get_var(“从tbl_参与者中选择参与者,参与者id='$current_number');
$\会话['names'][]=$name;
foreach($\会话['names']为$k=>$v){
回音“
  • ”.$v.
  • ”; } } 函数检查\u现有($item,$array){ if(在数组中($item,$array)){ 返回1; }否则{ 返回2; } }
    尝试mt_rand而不是rand。()

    编辑:

    担任这一职务的绅士:

    建议使用


    sha1(microtime(true).mt_rand(100009000))

    根据PHP手册,无需为随机数生成器设置种子(至少从PHP 4.2.0开始)。因此,每次运行php脚本时,它都应该返回不同的数字。您也可以尝试使用mt_rand(),但我认为它不会比rand()提供更好的随机性。手册只是说它的速度快了4倍,而且在一些旧的libc版本上,rand()有缺陷——但我认为这是很久以前写的

    你需要多少张唱片?您只需使用
    SELECT*fromtable ORDER BY rand()LIMIT 5
    ,但如果表(1000+)中有许多大记录,则速度可能会很慢


    如果只有91条记录,那么有时生成器很可能会再次生成相同的数字。有关如何生成X个唯一随机数的代码,您可以检查此问题的答案:

    第一个错误:$current_number=rand(0,$max);需要为$current_number=rand(0,$max-1);或者更好的是$current\u number=mt\u rand(0,$max-1);与其从check_existing()返回1和2,为什么不直接返回布尔值TRUE或FALSE?@MarkBaker:谢谢你的建议,我会更新我的代码。