2

これが私のコードです

<?php

function random_id() {
    $chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $id = '';
    for ($i = 0; $i < 5; ++$i)
    {
        $id .= $chars[rand(1, 26)];
    }
    echo $id;
}

random_id();

?>

小文字の5桁のIDを生成し続け、非常にまれに数字が含まれることがあります。私も試してみましたが、ループの前のスクリプトの最初とmt_rand()を使用srand(time())しました。srand(microtime())

また、それはすべきですrand(1, 26)rand(0, 25)

4

6 に答える 6

8

文字列が 26 文字を超えています。代わりに、次の rand 関数を使用してください。

rand(0, strlen($chars) - 1)

すべての反復で文字列の長さを計算するのではなく、動的に保つために、次のように計算をループの外に移動することを検討する価値があります。

$chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$chars_cnt = strlen($chars) - 1;
for ($i = 0; $i < 5; ++$i)
{
    $id .= $chars[rand(1, $chars_cnt)];
}
于 2013-01-20T17:09:05.460 に答える
4

配列全体を取得するのに十分な高さの乱数を生成していません。

小文字: 0-25

数字: 26-35

大文字の車: 36-61

于 2013-01-20T17:09:13.770 に答える
2

0は開始点であり、文字列strlen($chars)内の文字数です。コードを次のように変更する必要があります。$str

    for ($i = 0; $i < 5; ++$i)
    {
        $id .= $chars[rand(0, strlen($chars)-1)];
    }
于 2013-01-20T17:11:54.427 に答える
1

26 よりも大きな数字を使用することを覚えておく必要があると思います。これはアルファベットの文字数であるため、26+26+10= 62 を使用することをお勧めします。

$id .= $chars[rand(0, 61)];

乾杯!

于 2013-01-20T17:09:42.387 に答える
1

PHP の配列はゼロ インデックスなので、呼び出しの最初の数値はゼロにする必要があります。また、配列の先頭からのみ選択しています。

代わりにこれを使用してください:

for ($i = 0; $i < 5; ++$i)
{
    $id .= $chars[rand(0, 61];
}
于 2013-01-20T17:10:46.660 に答える
1

$chars は長さが 26 を超える文字列を保持しますが、乱数は 1 から 26 (両端を含む) の間です。文字列インデックスは、char a である 0 から始まります。今のところ、文字 bcd...xyz1 のみが使用されます。文字列の長さを動的にチェックして、有効な乱数を取得できます。

function random_id() { 
    $chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
    $chars_cnt = strlen($chars)-1; 
    $id = ''; 
    for ($i = 0; $i < 5; ++$i) 
    {   
        $id .= $chars[rand(0, $chars_cnt)]; 
    } 
    return $id; 
} 

echo random_id(); 
于 2013-01-20T17:13:43.823 に答える