【问题标题】:Generating random numbers in php在php中生成随机数
【发布时间】:2012-01-05 11:17:47
【问题描述】:

我正在尝试使用 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;
    }
}

【问题讨论】:

  • 第一个错误:$current_number = rand(0, $max);需要 $current_number = rand(0, $max-1);甚至更好 $current_number = mt_rand(0, $max-1);
  • 与其从 check_existing() 返回 1 和 2,不如简单地返回一个布尔值 TRUE 或 FALSE?
  • @MarkBaker:感谢您的建议,我会更新我的代码。

标签: php


【解决方案1】:

尝试使用 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(true).mt_rand(10000,90000))

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2014-05-18
      相关资源
      最近更新 更多