• ベストアンサー

4桁の乱数の発生

数字と小文字のアルファベットからなる4桁の乱数を作るにはどうすればいいですか? srand((double)microtime()*1000000); $r = rand(); この後どうすればいいですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jxt
  • ベストアンサー率48% (42/86)
回答No.3

自分だったら <?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); ?> こんな感じで。

amurit
質問者

お礼

数字もアルファベットも出現させるソースがよかったです。 ありがとうございました。

その他の回答 (4)

  • tomy06
  • ベストアンサー率25% (58/224)
回答No.5

私の場合は、こんな感じ <?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でパスワード生成してくれるものがありますが、 # 何故か全角文字が出現するので使えないです

amurit
質問者

お礼

回答の中にmd5()が有る理由がわかりませんでしたが、数字とアルファベットは両方なくてもいいなら、ANo.#3のMD5よりも高速なtomy06さんの方法より高速でした。 62は61に直しました。

回答No.4

ハッシュ値って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); }

amurit
質問者

お礼

それは大文字です。 elseの方についてはstrlenは不要です。不要なstrlenを取り払っても、chr($r - ...);より遅いです。

  • ryuta_mo
  • ベストアンサー率30% (109/354)
回答No.2

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)
回答No.1

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';

関連するQ&A