• ベストアンサー

4桁の乱数の発生

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

  • PHP
  • 回答数5
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • エクセルで3ケタの乱数

    今度くじ引き大会をするのに3ケタの数字を250名ほどに配りたいのですが、それぞれの数字が重複なくかつ各桁数の数字が重複しないで乱数をエクセルで生成する方法を教えてください。(例えば、101,221,199などは除外したいです) RAND,RANDBETWEEN関数を使ってみましたが、重複してしまうし、221などのような各桁で数字が重複してしまうものができてしまうのでうまくいきません。 よろしくお願いします。

  • 32768以上の乱数を作りたいのですが

    現在srandをした後、randを使って乱数を作っているのですが、 最低100万、できれば1000万の精度の乱数を作りたいのです。 しかしどうやら上限が32768までらしく、困っております。 今の私には32768の乱数を306個作って足す程度しか思いつかず。 何かもっと負担の少なくシンプルな方法はないでしょうか・・?

  • 乱数発生

    #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int y, m, l; srand( (unsigned)time( NULL ) ); y=rand() % 2500 + 1600; m=rand() % 12 + 1; l=rand() % 29 + 1; printf("西暦%d年%d月%d日",y,m,l); return(0); }今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600; というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。

  • 標準正規分布の乱数

    RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。 中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、 x = 分散 * (Σ[1~12]RAND() - 6) + 平均 で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は x = Σ[1~12]RAND() - 6 ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか? もし間違ってたら指摘してください。 参考文献「Cによるシミュレーションプログラム 石川宏」 #include <stdio.h> #include <stdlib.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) #define NUMBER 10000 /* 発生させる乱数の数 */ main(void) { int j; double u, x; srand(5); for (j = 0; j <= 11; j++) { u = u + RAND(); } x = u - 6.0; }

  • 乱数について(C言語)

    C言語において,乱数の範囲を 0 ≦ r < 1 とする場合には double r=(double)rand()/(RAND_MAX+1); とするのは知っているのですが0 < r ≦ 1にする場合の方法がわからず困っています. アドバイスいただきたいです.

  • 乱数の最大値

    C言語で0~Nまでの乱数を発生させる場合、 srand((unsigned) time(NULL)); rand()%N; とやりますよね。 このやり方だと、発生する乱数はRAND_MAX以下しかできません。 RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか?

  • Excel2003で乱数を作る関数

    Excel2003上で任意でパスワードを作りたいのですが、 できれば関数のみで作る方法をお教えください。 条件は以下です。 ・同じシート内にパスワードを作り積み上げていく。 ・左から6ケタ ・左から 任意の大文字アルファベット1つ 任意の小文字アルファベット1つ 0~9の任意の数字4ケタ ・毎日、10個程度のパスワードを発行したい ・できれば重複は避けたい などです。 数字4ケタのみなら簡単な関数で乱数のようなものを作れたのですが、アルファベットも絡むと難しくて… ご教授いただけると幸いです。

  • 乱数について

    C言語で0~1の乱数を作成する部分を書いているのですが num[i] = rand()/(RAND_MAX+0.1); と書いてループさせています。 numはdouble型で定義しているのですがこれで実行すると桁数が下6桁まで表示されてしまいます。 欲しいデータは0.1、0.2・・・1.0までの0.1刻みのデータなのですが桁数を制限するにはどうすればいいのでしょうか?

  • 乱数の取得

    キー操作をした時に複数の乱数を習得させようと思っています。 【キ─操作関数】  int num[3] = {11, 22, 33}; ←初期化のため数字は適当です。  srand((unsigned int)time(NULL))  for(int i=0; i<=3; i++)  {   num[i] = rand % 10;  } 上記のプログラムを書いています。 num[0]、num[1]、num[2]にそれぞれ0~9の乱数が入ると思うのですが、 num[0]にしか乱数が入りません。 num[1]、num[2]には同じ数字(恐らくtimeで取得した数字?)が入っています。 何かお気づきの点がありましたらアドバイスお願い致します。

  • エクセルの乱数発生についてお尋ねします。

    rand()のような関数のファミリーを使うと乱数が発生できます。 そこで、ある程度広がりを持ったシート内に乱数を発生させました。 それは満足していますが、マウスで処理をしたり、何かをアクティブにしたり非アクティブにしたりする操作をすると、乱数が毎回発生してしまいます。シートの数字がパッと変わるのです。 乱数を発生させるタイミングがコントロールできていないわけですが、どのように考えたらいいでしょうか。1回乱数を発生させたら固定したままで、”では、ここで乱数を発生させる”というコマンドの出し方なのですが。エクセルではどうしたらいいでしょうか。

専門家に質問してみよう