3

こんにちは私はこの関数を持っていて、それは通知を返します:

注意:初期化されていない文字列オフセット

function generaterandomkey($length) {       

    $string='';
    $characters = "0123456789abcdef";
    for ($p = 0; $p < $length ; $p++) {
        $string .= $characters[mt_rand(0, strlen($characters))];            
    }

    return $string;
}

影響を受ける行は次のとおりです。

$string .= $characters[mt_rand(0, strlen($characters))];

中かっこでやってみましたが、うまくいきません。誰かがいくつかの提案を指摘することができれば、私はそれを高く評価します。ありがとう。

4

2 に答える 2

9

$charactersが原因でオーバーランすることがありますがstrlen($characters)、これは である必要がありますstrlen($characters) - 1。ランダムな範囲は 0 で始まり、長さから 1 を引いた値で終わる必要があります。の長さ$charactersが 10 の場合、最後のゼロベースの配列インデックスは9であり、これがランダム選択の上限になります。

$string='';
$characters = "0123456789abcdef";
for ($p = 0; $p < $length ; $p++) {
    $string .= $characters[mt_rand(0, strlen($characters) - 1)]; 
}

ランダムに選択しているため、常に通知を受け取るとは限りませんmt_rand()。ループのある時点で最大値が返された場合にのみ発生します。

于 2013-03-21T02:58:23.323 に答える