Php 总位数不一致

Php 总位数不一致,php,Php,我使用下面的代码来获得随机十六进制值。但产出并不一致 有时返回6位,有时返回5位 function generateHexValue($length=6) { $chars = "0123456789abcdef"; $i = 0; $str = ""; while ($i<$length) { $str .= $chars[mt_rand(0,strlen($chars))]; $i++; } ret

我使用下面的代码来获得随机十六进制值。但产出并不一致 有时返回6位,有时返回5位

function generateHexValue($length=6) 
{
    $chars = "0123456789abcdef";

    $i = 0;
    $str = "";

    while ($i<$length) {
        $str .= $chars[mt_rand(0,strlen($chars))];
        $i++;
    }

    return $str;    
}

$col=generateHexValue();
echo "<div style='background-color:#".$col."; width:100px; height:100px;'></div>";
echo $col."<br/>";
函数generateExValue($length=6)
{
$chars=“0123456789abcdef”;
$i=0;
$str=”“;

而($i您对
mt_rand()
的调用的最大值应为
strlen($chars)-1
,而不是
strlen($chars)
mt_rand
的最大值包含在内。您可以从
$chars
数组的末尾获取索引(例如
$chars[16]
,这是
$chars
的未定义偏移量)。不确定PHP会如何处理。

这是因为
mt_rand(0,strlen($chars))
返回一个介于0和16(包括)之间的数字,但是您的
$chars
字符串只有偏移量0-15。一个经典错误就错了。

substr(md5(mt_rand()),0,6)
做同样的事情,但速度更快。

完全正确。您甚至可能会收到一个空字符串。您的字符串最后一个字符索引是15,而
strlen($str)
返回16。
$str[16]
为空,因此不会向字符串中追加任何内容。
我还没有查看代码以了解可能的错误
这不是一个很好的回答开始……说真的,不是。此外,由于您运行的是很少解释的代码,所以速度会更快,尽管我怀疑这是一个问题。@Bobby主题尖叫说海报在做什么这已经做了一百万次了,为什么不继续尝试和测试呢?输入错误。作为一个类比,如果有人让您查看他们编写的代码,将文件读入数组(以“\n”分隔),您会调试代码还是让他们使用函数file()?两者都有…写你自己的代码是有原因的。有时这也是一个真实代码的精简示例或一个简单的练习。至少看看他的代码,或者至少不要写你甚至没有读过的代码,因为这听起来像是
我读过标题,我知道你做错了,所以按我的方式做吧