こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javaの乱数生成プログラム-バグを教えてください

こんにちは。Web上で「重複しない乱数」を作るプログラムをいくつか見まして、どれもこれも何でこんな複雑なステップを踏むのであろう思い、どーだこんなに簡単に作れるじゃん・・・と0-9までの整数で乱数を生成するプログラムを書いてみたんです。これならAPI調べなくたって基本を身につけていれば誰でも書けると・・・けど、生成する乱数の数が100個とか200個とかなら問題ないんですが、例えば9桁の乱数を10000個作るように設定しても7500個くらいしかListに入りません。原因がどこにあるかお教えいただけますでしょうか。なにとぞよろしくお願いします。

import java.util.ArrayList;
import java.util.List;

public class RandomExec {
static int idLength=9; //乱数の桁数を指定
static int elmSize=100; //生成する乱数の個数を指定
static List<String> list = new ArrayList<String>(); //乱数を格納するリスト

public static void main(String[] args) {
addList(); //生成された乱数を要素に持つリスト list を取得
//要素をひとつずつコンソール出力
for(String s : list){
System.out.println(s);
}
}
//リストに入れるための乱数を生成するメソッド
public static String addId(){
int[] id=new int[idLength]; //int配列idを宣言(要素数=乱数の桁数)
String s="";
String str;
//配列にMath.random()で取得した要素を入れる
for(int i=0; i<idLength; i++){
int n=(int)(Math.random()*10);
id[i]=n;
}
//指定した桁数(この場合は9個)の数字から成るString s を得るため
//int型配列idの要素をStringに変換し、すべての要素を連結する
for(int n : id){
str = String.valueOf(n);
s+=str;
}
return s; //生成されたStringを返す(下のaddList()メソッドに返しています)
}

//addIdメソッドで作った要素候補をチェックし、重複がなければListに加えるメソッド
//List list の要素数が変数elmSizeで指定した乱数の数と同じになるまで繰り返す
public static void addList(){
while(list.size()<elmSize){
//addIdメソッドでlistの要素候補strを取得
String str = addId();
//listに候補と同じ文字列を持つ要素が存在しなければlistに加える
if(!list.contains(str))list.add(str);
}
}
}

投稿日時 - 2011-02-24 16:02:58

QNo.6547143

暇なときに回答ください

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

eclipseで実行結果を確認しているのであればコンソールの出力バッファを
超えているために前のほうが消えているのではないでしょうか?
参考URL先を見て設定を変更してみてください。

もし他の方法で出力しているのであれば一行ずつ出力するループの前後に
"start","end"を出力して結果にもそれが出力されるか確認してみてください。

参考URL:http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d3M4160/EM410047.HTM

投稿日時 - 2011-02-24 17:04:20

お礼

ご回答ありがとうございました。バッファが足りない・・・どうして思いつかなかったのでしょう。まだjavaのプログラミングに自信がなくて、期待通りに動かないと即バグだとおもってしまうんです。それにしても今回の質問は穴があったら速攻で入ります。

投稿日時 - 2011-02-24 17:43:46

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

いろいろ突っ込みどころの多いコードだけど
動作上のバグはないわね。

その
7500個くらい
というのはどうやって図ったの?

たぶんその図り方に問題があると思っているわ。

mainを
public static void main(String[] args) throws Exception {
PrintStream out = new PrintStream(new File("C:\\log.log"));
addList(); // 生成された乱数を要素に持つリスト list を取得
// 要素をひとつずつコンソール出力
for (String s : list) {
out.println(s);
}
}
こう書き換えて実行後log.logを見てみなさい。
ちゃんと10000個出ているはずよ。

投稿日時 - 2011-02-24 17:11:54

お礼

ご回答ありがとうございました。おっしゃるとおりです。もう、何も考えずあたふたとつまらない質問をしてしまいましてすみませんでした。質問する前にファイルに落として確認するとか、当然のことなのに。これから気をつけます。

投稿日時 - 2011-02-24 17:46:36

あなたにオススメの質問