アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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);
?>

こんな感じで。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/03/04 01:31

私の場合は、こんな感じ



<?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でパスワード生成してくれるものがありますが、
# 何故か全角文字が出現するので使えないです
    • good
    • 0
この回答へのお礼

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

62は61に直しました。

お礼日時:2004/03/04 02:07

ハッシュ値って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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/03/04 02:03

No1のCのプログラムにミスが・・・


rn[n]=val[rand()*36]; →rn[n]=val[rand()%36];

No1のプログラムを簡単に解説すると0~35の乱数を4つ作ってそれを0-9 a-zに置き換えています。

わからないことがあれば聞いてください。
「わかる範囲で」答えます。
    • good
    • 0

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';
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!