Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成非重复随机数-PHP_Php_Random - Fatal编程技术网

生成非重复随机数-PHP

生成非重复随机数-PHP,php,random,Php,Random,我试图在php中获得一个自定义函数,以返回1和20之间的一个随机数,该随机数不会重复,即多次生成相同的数字,因为我随后需要使用该数字导航到二十个网页中的一个,我不希望显示相同的网页 以下是我的代码,分为三个步骤: <form action="rand.php"> <p>Click this button to display a random number that does not repeat...</p> <p>

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

以下是我的代码,分为三个步骤:

<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>
下面是
functions.php

require_once('functions.php');

$page = generateNumber();
echo $page;
<?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;
    }
}

?>

我的代码似乎在运行,但是,它在重复数字,所以我显然做错了什么。我最初检查
计数的原因是,它返回第一个数字,因为它是一个新的数字


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

我会保持简单

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

我会保持简单

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

为了在每次访问页面时不重复地浏览所有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;
}
?>

为了在每次访问页面时不重复地浏览所有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;
}
?>


$check[]
未使用当前页码填充填充填充填充范围(0,20),循环遍历可能重复的,您可能需要在会话中存储阵列。另外,当您使用了全部20个数字时会发生什么情况?我希望通过在特定会话变量上使用
count
函数来捕获它,该变量监视人们对每个网页回答了多少问题,因为这是针对已经启动并运行的在线调查。每次有人提交时,我都使用
标题
功能重定向到下一个网页。而不是page01转到page02和page03等。我希望它随机选择一个数字,我可以在
header
函数中与url字符串连接。例如:“www.website.com/page0”$嗯。co.uk“
$check[]
未使用当前页码填充填充填充填充范围(0,20),循环遍历可能重复的,您可能需要在会话中存储数组。另外,当您使用了全部20个数字时会发生什么情况?我希望通过在特定会话变量上使用
count
函数来捕获它,该变量监视人们对每个网页回答了多少问题,因为这是针对已经启动并运行的在线调查。每次有人提交时,我都使用
标题
功能重定向到下一个网页。而不是page01转到page02和page03等。我希望它随机选择一个数字,我可以在
header
函数中与url字符串连接。例如:“www.website.com/page0”$嗯。co.uk'Dave每次运行scritThanks时,您的解决方案不会返回1到20之间的唯一数字。我喜欢Dave代码的简单性,但如果它没有返回唯一的数字,我需要研究和试验您的代码,因为您使用的是我以前从未使用过的函数,以及您使用
do while
的技巧。为什么在整个代码中频繁使用
*
?Dave每次运行scritThanks时,您的解决方案都不会返回1到20之间的唯一数字。我喜欢Dave代码的简单性,但如果它没有返回唯一的数字,我需要研究和试验您的代码,因为您使用的是我以前从未使用过的函数,以及您使用
do while
的技巧。为什么在整个代码中频繁使用
*
?如果此代码被包装在一个函数中,比如调用
getPageNumber()
,那么每次调用时
是否会以不同的方式洗牌这些数字?另外,如何确保脚本重新运行时,即当多个表单标记引用相同的
.php
文件时,您的
页面
变量不会重新初始化,从而给我一个我已经拥有的编号?如果此代码包装在一个名为
getPageNumber()
的函数中,每次呼叫时,
shuffle
是否会以不同的方式洗牌?此外,如何确保脚本重新运行时,即当多个表单标记引用相同的
.php
文件时,不会重新初始化
页面
变量,从而给我一个我已经拥有的数字?