- ベストアンサー
4桁の乱数の発生
数字と小文字のアルファベットからなる4桁の乱数を作るにはどうすればいいですか? srand((double)microtime()*1000000); $r = rand(); この後どうすればいいですか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
自分だったら <?php srand((double)microtime()*1000000); $r = rand(); echo substr(md5($r),0,4); // ハッシュかけて先頭四文字抜き出す ?> ただし数字だけ、アルファベットだけ、となってしまう場合があるので <?php srand((double)microtime()*1000000); $r = rand(); while (!ereg('[a-zA-Z]',substr(md5($r),0,4)) || !ereg('[0-9]',substr(md5($r),0,4))) { $r = rand(); } echo substr(md5($r),0,4); ?> こんな感じで。
その他の回答 (4)
- tomy06
- ベストアンサー率25% (58/224)
私の場合は、こんな感じ <?php $pslist = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for ($i=0;$i<7;$i++){ $num = rand(0,62)."\n"; $passwd .=substr($pslist,$num,1); } echo md5($passwd)."\n"; echo $passwd."\n"; ?> # pearでパスワード生成してくれるものがありますが、 # 何故か全角文字が出現するので使えないです
お礼
回答の中にmd5()が有る理由がわかりませんでしたが、数字とアルファベットは両方なくてもいいなら、ANo.#3のMD5よりも高速なtomy06さんの方法より高速でした。 62は61に直しました。
- GuruGuru22
- ベストアンサー率51% (177/346)
ハッシュ値って16進数では? 私はこんな感じで。 1文字だけの場合ね。。 srand((double)microtime()*1000000); $r = rand(65,100); if($r<91){ print chr($r); }else{ $r = $r -90; print substr($r,strlen($r)-1,1); }
お礼
それは大文字です。 elseの方についてはstrlenは不要です。不要なstrlenを取り払っても、chr($r - ...);より遅いです。
- ryuta_mo
- ベストアンサー率30% (109/354)
No1のCのプログラムにミスが・・・ rn[n]=val[rand()*36]; →rn[n]=val[rand()%36]; No1のプログラムを簡単に解説すると0~35の乱数を4つ作ってそれを0-9 a-zに置き換えています。 わからないことがあれば聞いてください。 「わかる範囲で」答えます。
- ryuta_mo
- ベストアンサー率30% (109/354)
0-9,a-zの36種を使って4文字の乱数を作るということでしょうか? PHPをやったことが無いんで言語共通のアドバイスだけ。 0,1,2,・・・,8,9,a,b,・・・,y,zという1次元36要素の配列を作ります。 0~35までの乱数を作りその乱数の数値の要素を結果用の変数に代入する。 これを4回繰り返します。 Cで書くとこうなります。 int n; char val[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; char rn[5]; for(n=0;n<4;n++) rn[n]=val[rand()*36]; rn[4]='\0';
お礼
数字もアルファベットも出現させるソースがよかったです。 ありがとうございました。