dポイントプレゼントキャンペーン実施中!

JAVAにて、6桁の数値を重複なしでランダムに取り出したいのですが、どのようにすればよろしいでしょうか?

下記関数を使って6桁の数値を取り出す事についてはできたのですが、これだと何万分の一(?)ですが、取得数値が重複する可能性があります。これを防止する為にはどうしたらよろしいでしょうか。皆様のお知恵を拝借いたしたく宜しくお願いいたします。

newNo = (int)(Math.random() * 999999 + 100000);

A 回答 (5件)

もう既に登録してあるのであれば、


ランダムに数字を取得する関数と、
数字が取得してあるか確認する関数を用意して、
両方の関数を必ず通るようにしてから登録という流れでいいのでは?

ランダム数値取得関数()
数字取得してあるか関数(取得したランダム数値)
の流れで、数字が登録済みチェック関数の戻り値をbooleanなどにして、
booleanの結果で上記をループし続けるでいけると思いますが。

例を挙げるとしたら、
boolean loopFlg = true;
int randNum;

while( loopFlg) {
randNum = randomNumberCreate();
loopFlg = checkNumberRegistered(randNum); ←登録されてなかったらfalseを返す
}
こんなんでいけると思いますよ。
関数の実装はご自分で・・・
    • good
    • 0
この回答へのお礼

分かりやすいご説明ありがとうございます。
なるほど、BOOLEANを使うというのは思いつきませんでした。
というより、この関数の使い方が良く分かっていなかったのですが。

ありがとうございました。

(備考)
下記のようにも組んでみても上手くいきました。

int newNo = 0;
newNo = (int)(Math.random() * 999999 + 100000);
StringBuffer bufSql = new StringBuffer();
bufSql.append("SELECT");
bufSql.append(" fid "); //お客様ID取得
bufSql.append("FROM tbl_customer ");
ResultSet rs1=statement.executeQuery(bufSql.toString());
while( rs1.next())
{
int Fid = rs1.getInt("fid");
if (Fid == newNo)
{
newNo = (int)(Math.random() * 999999 + 100000);
}
}

お礼日時:2010/01/06 13:55

では、少しちがったアプローチを


下準備
(1)100000~999999を配列に順番に用意
(2) (1)の配列をシャッフル
(3) (2)をファイルに書き出す

使用方法
新しい登録要求があったら↑(3)のファイルの先頭6文字を取り出す。ファイルはその分削ったものにする(終りからの方が削りやすいか?)

課題
同時にファイルにアクセスしないようにする
ファイルが外ら見えないように隠す

SQLなら、↑(3)を未使用ID用データベースにして、先頭レコードからIDを取り出して削除、でもいいかも
    • good
    • 0

補足回答を読み、失礼ながら苦笑してしまいました。


すでに、取得した乱数を保存しているじゃないですかー!
ようは、テーブルに保存しているときに、主キーが重複していたら、キー(乱数)を取得しなおせばいいんですよ。

この回答への補足

補足回答ありがとうございます。
お恥ずかしい話で申しわけありません。
まだ勉強始めたばかり(4ヶ月程度)なので、どうも思いつきません。

その本題の主キーが重複していた時に乱数を取得し直す方法をWhile文とIF文等を使ってやってみようとしているのですが、どうやったらいいもんでしょうか?
初歩的な質問で申しわけありません。宜しくお願いします。

補足日時:2010/01/05 13:13
    • good
    • 0

配列にすでに出てきた数字を残して チェックすれば よいのでは ないでしょうか?





import java.util.ArrayList;
public class Main {

public static void main(String[] args) {
new Main() .start();
}

private void start() {
int newNo = 0;
for(int i =0;i<100;i++){
newNo = (int)(Math.random() * 999999 + 100000);
if(chkNum(newNo)){
System.out.println(newNo);//処理
}
}
}
ArrayList<Integer> chk = new ArrayList<Integer>();
boolean chkNum(int num){
for(int i = 0;i<chk.size();i++){
if(chk.get(i).intValue()==num)return false;
}
chk.add(num);
return true;
}
}

この回答への補足

早々のご返事ありがとうございます。
なるほど。出てきた数値を記憶させておくという手もありますね。

ただ説明不足だったので申しわけありません。
今作成しているのは貸付金管理システム(アコムのHPのようなもの)で、お客様が新規登録でランダムの6桁の数値をIDとしてMYSQLに登録。次回以降のお客様が同じ数値をランダムで取得しないようなプログラムにしたいと思っております。
そこを防ぐ為にIF文やWhile文も考えたのですが、どうしても思いつきません。ご教授頂けたら幸いです。宜しくお願いします。

補足日時:2010/01/05 12:19
    • good
    • 0

「既出の数値」を覚えておいてチェック.

    • good
    • 0

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