【问题标题】:Random page generation excluding already generated options in php随机页面生成,不包括 php 中已生成的选项
【发布时间】:2012-12-25 19:14:10
【问题描述】:

我想要实现的是制作每次从 MySQL DB 生成不同内容的网页。但是当我使用 rand() 函数时,一些选项可以重复。所以我想做的是使用动态数组“异常”制作rand()函数,每次生成网页内容时都会更新,所以每个选项只向用户显示一次..

假设我有 5 种不同的选择 1,2,3,4,5

当rand()函数下一次选择3时,就没有机会得到3了..

function randWithout($from, $to, array $exceptions) {
sort($exceptions); 
$number = rand($from, $to - count($exceptions));
foreach ($exceptions as $exception) {
    if ($number >= $exception) {
        $number++; 
    } else  {
        break;
    }
}

    return $number;
}

    $exceptions = array("3","4");
    $random = randWithout(1, $num_rows, $exceptions);

这是我想要的,但我希望数组“$exceptions”每次都更新......

有没有办法通过使用会话或其他选项来做到这一点?我不想使用另一个 MySQL 表。我希望它快速简单

谢谢

【问题讨论】:

  • 将数组存储在$_SESSION 中可以正常工作。
  • 尝试使用 mt_rand(),随机性更好
  • 您可以使用像LFSR 这样的伪随机数生成器...这样您就不必记住所有异常...只需记住种子和最后生成的值...

标签: php mysql random options


【解决方案1】:

使用会话。会话用于数据持久性。像这样启动你的 php 文件:

<?php session_start();
//your code

将您的异常保存在会话变量中:

$_SESSION['exceptions']='exceptions Array';

每次用户访问页面时,都会将其添加到会话中。

假设您想在其中添加“5”。

她更新的代码

<?php session_start();
function randWithout($from, $to) {
global $exceptions;
sort($exceptions); 
$number = rand($from, $to - count($exceptions));
foreach ($exceptions as $exception) {
    if ($number >= $exception) {
        $number++; 
    } else  {
        break;
    }
}

    return $number;
}

if(isset($_SEEION['exceptions'])){
$exceptions =$_SESSION['exceptions'];
}

$random = randWithout(1, $num_rows);
$exceptions[]=$random;
$_SESSION['exceptions']=$exceptions;

【讨论】:

  • 我也在想..有没有办法在达到所有组合时重置数组?
  • 或者..会话可以在一段时间后“销毁”吗?像 cookie.. 我不想使用 cookie,因为有些访问者可能会关闭它们..
  • 你 session_destroy();和会话是用户特定的..当浏览器关闭时全部销毁..所以需要专门做
【解决方案2】:

这个一般性问题之前已经回答过。见How to generate a list of unique random numbers?。为每个可能的页面分配一个编号,然后使用适当的方法选择一个。

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多