在php中生成随机数

时间:2012-01-05 11:17:47

标签: php

我正在尝试使用php中的rand()函数从mysql数据库生成选择名称。该程序工作正常但是可以使结果更随机,因为我得到的一些记录是相同的(每当我清除会话并重新开始),而其他记录可能不会被选中。我目前有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;
    }
}

2 个答案:

答案 0 :(得分:5)

尝试使用mt_rand而不是rand。 (http://php.net/manual/en/function.mt-rand.php

编辑:

这篇文章中的一位先生:

What is the best way to generate a random key within PHP?

建议使用

SHA1(microtime中(真).mt_rand(10000,90000))

答案 1 :(得分:2)

根据PHP手册,不需要为随机数生成器播种(至少从PHP 4.2.0开始)。所以每次运行php脚本时它应该返回不同的数字。您也可以尝试使用mt_rand(),但我认为它不会给你更好的随机性rand()。手册只是说它快了4倍,而且在一些旧的libc版本中,rand()是错误的 - 但我认为这是很久以前写的。

您需要多少条记录?您可以使用SELECT * FROM table ORDER BY rand() LIMIT 5,但如果表(1000 +)中有许多大型记录,则速度可能会很慢。

如果您只有91条记录,很可能有时发电机会再次生成相同的数字。有关如何生成X个唯一随机数的代码,您可以查看此问题的答案:Generating UNIQUE Random Numbers within a range - PHP