【问题标题】:Generating a Non-Repeating Random Number - PHP生成非重复随机数 - PHP
【发布时间】:2015-08-25 20:47:15
【问题描述】:

我正在尝试在php 中获取自定义函数以返回120 之间不重复的随机数,即多次生成相同的数字,因为我需要随后使用这个数字导航到二十个网页之一,我不希望显示相同的网页。

这是我的代码分三步:

<form action="rand.php">
        <p>Click this button to display a random number that does not repeat...</p>
        <p><input type="submit" value="Generate"></p>
    </form>

这里是rand.php

require_once('functions.php');

$page = generateNumber();
echo $page;

这里是functions.php

<?php

$check = array();

function generateNumber() {

    global $check;

    $page_no = mt_rand(1,20);
    $check[] = $page_no;

    if (count($check) != 1) {

        foreach ($check as $val) {
            if ($val == $page_no) {
                $page_no = mt_rand(1,10);
                continue;
            }
        }
        return $page_no;
    }
    else {
        return $page_no;
    }
}

?>

我的代码似乎可以正常工作,但是,它是重复数字,所以我显然做错了什么。我最初检查count 的原因是无论如何都会返回第一个数字,因为它将是一个新数字。

为了查看数字变化,我一直在浏览器中刷新rand.php 页面。

【问题讨论】:

  • $check[] 未填充当前页码
  • 洗牌范围(0,20),循环遍历它
  • 您可能需要将数组存储在会话中。另外,当你用完所有 20 个数字时会发生什么?
  • 我希望通过在特定会话变量上使用 count 函数在它的数字用完之前捕获它,该函数监视人们为每个网页回答了多少问题,因为这是为了已经启动并运行的在线调查。每次有人提交时,我都会使用header 函数重定向到下一个网页。而不是 page01 转到 page02 和 page03 等。我希望它随机选择一个数字,我可以在 header 函数中与 url 字符串连接。例如。 `'www.website.com/page0' 。 $num 。 '.co.uk'

标签: php random


【解决方案1】:

我会保持简单。

// List numbers 1 to 20
$pages = range(1,20);
// Shuffle numbers
shuffle($pages);
// Get a page
$page = array_shift($pages);

【讨论】:

  • 如果这段代码被包装在一个函数中,比如说被称为getPageNumber()shuffle 是否会在每次被调用时以不同的方式洗牌?另外,如何确保您的 pages 变量在脚本重新运行时不会重新初始化,即当多个表单标签引用同一个 .php 文件时,因此给我一个我已经拥有的数字?
【解决方案2】:

为了在每次页面访问时遍历所有 20 个数字而不重复,您需要设置一个会话变量。

<?php
session_start();
if (!isset($_SESSION['numbers'])) {
    $_SESSION['numbers']="*"; //---create the session variable
}

function get_number() {
    $i = 0;
    do { 
        $num=rand(1,20); //---generate a random number
        if (!strstr($_SESSION['numbers'],"*".$num."*")) { //---check if the number has already been used
            $_SESSION['numbers']=$_SESSION['numbers'] . $i . "*"; //---add the number to the session variable to avoid repeating
            if (substr_count($_SESSION['numbers'],"*")>=21) { //---resets the session variable when all 20 number have been used
                $_SESSION['numbers']="*";
            }
            $i=$num; //---ends the while loop to return the value
         }  
    } while ($i==0);
    return $i;
}
?>

【讨论】:

  • Dave 每次运行脚本时,您的解决方案都不会返回 1 到 20 之间的唯一数字
  • 谢谢。我喜欢 Dave 代码的简单性,但如果它没有返回唯一编号,我将需要研究和试验您的代码,因为您使用的是我以前从未使用过的函数,以及您使用 do while 的技术。为什么你在整个代码中经常使用*
猜你喜欢
  • 2011-11-24
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
相关资源
最近更新 更多