phpで

・重複しない
・ランダムな16桁の数字
を作りたいです。
5万個ぐらい作りたいです。

md5だと英字も入ってしまうし・・・
良い方法を教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:dev_zer0 No.1

回答回数332ベストアンサー獲得回数25

ポイント10pt

perlなんですけど...一応動きます

#!/bin/perl

srand(0);

# 乱数が重複する可能性があるのでfor文は無理

$i = 0;

while($i < 50000) {

  # 上位8桁、下位8桁を乱数で求める

  $h = rand(100000000); $l = rand(100000000);

  # 文字に変換する

  $s = sprintf(”%08d08%d”, $h, $l);

  # 数値のキーだと何かおかしな動作をしそうなので...

  $k = ”k” + $s;

  # まだ定義されていない乱数の場合

  unless(defined($val{$k})) {

    # 連想配列に追加

    $val{$k} = $s;

    $i++;

  }

}

# 乱数の出力

while(($n, $v) = each(%val)) {

print(”$v¥n”);

}

id:pingoo No.2

回答回数18ベストアンサー獲得回数0

ポイント20pt

http://www.stackasterisk.jp/tech/php/php03_08.jsp

PHP第3回:PHP応用(配列:foreach/array_walk/array_rand)

URLにランダムでパスワードを生成するサンプルプログラムがあります。このプログラムではパスワードに使用する文字を$pwelemstrという変数に入れています。ここで数字だけを入れてパスワード長を16桁にすればランダムに作ることができるでしょう。重複しないためには生成済みのパスワードをDBにでも格納して新しいパスワードを生成するたびに同じ数字が発生していないかを確認するようにすれば問題ないでしょう。

id:kunitz

ありがとうございます!

ランダムパスワード生成

2005/02/01 12:39:07
id:Beth No.3

回答回数94ベストアンサー獲得回数1

ポイント20pt

GUIDはいかがでしょうか?

http://www.atmarkit.co.jp/icd/root/52/94084052.html

Insider's Computer Dictionary [GUID] − @IT

GUIDの解説(ご参考用)

http://en.wikipedia.org/wiki/GUID

Globally Unique Identifier - Wikipedia, the free encyclopedia

GUIDの解説(ご参考用)

GUIDの仕様書(ご参考用)

id:kunitz

ありがとうございます!

GUID

2005/02/01 12:39:36
id:Beth No.4

回答回数94ベストアンサー獲得回数1

ポイント20pt

再回答で失礼します。

■上記URLにPHPのmt_rand()(Mersenne Twister型乱数生成)を用いて

16桁のランダム文字列を生成するコードが掲載されています。

対象文字列を数字のみに限定すれば、活用できるのではないでしょうか。

生成された文字列が重複していないかどうかの確認は

例えばこうなります。

一例

(1)配列Aには、上記方法で生成した16桁の文字列が5万個入っている。

(2)配列Aを配列Bにコピーする。

(3)配列Bを文字列としてソートする。(昇順もしくは降順)

(4)配列Bについて、添え字0の文字列と添え字1の文字列が重複していないかチェック。

(5)配列Bについて、添え字1の文字列と添え字2の文字列が重複していないかチェック。

(6)このようにして隣接した文字列が重複していないかどうかを配列Bの全範囲についてチェックする。

(7)重複が確認されなかったら、配列Aは所定の仕様を満たしたことになる。

もしも重複が出るようでしたら、配列Aにあらかじめ5万個以上(例えば10万個)の文字列を

収納しておき、(6)の照合作業時に重複したものが見つかった場合、

削除すればいいでしょう。

■1回目の回答のGUID、一度生成された数値が再度出現する確率は限りなくゼロですので、

ひたすら生成を繰り返せば、取得できます。

一例

(1)(10進数で)16桁以下の数値が5万個出現するまで生成を繰り返す。

(16桁未満の数字は頭にゼロを補って、16桁とみなす。)

(2)GUID(128bit長)を5万個生成し、それらの(10進数で)下位16桁を取得する。

もしくは5万個以上生成して配列に格納した上で、前述手法で重複の確認・削除をする。

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません