
こんにちは。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);
}
}
}
No.1ベストアンサー
- 回答日時:
eclipseで実行結果を確認しているのであればコンソールの出力バッファを
超えているために前のほうが消えているのではないでしょうか?
参考URL先を見て設定を変更してみてください。
もし他の方法で出力しているのであれば一行ずつ出力するループの前後に
"start","end"を出力して結果にもそれが出力されるか確認してみてください。
参考URL:http://www.hitachi.co.jp/Prod/comp/soft1/manual/ …
ご回答ありがとうございました。バッファが足りない・・・どうして思いつかなかったのでしょう。まだjavaのプログラミングに自信がなくて、期待通りに動かないと即バグだとおもってしまうんです。それにしても今回の質問は穴があったら速攻で入ります。
No.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個出ているはずよ。
ご回答ありがとうございました。おっしゃるとおりです。もう、何も考えずあたふたとつまらない質問をしてしまいましてすみませんでした。質問する前にファイルに落として確認するとか、当然のことなのに。これから気をつけます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンストラクタと多重度
-
乱数を発生させて、それを配列...
-
[Ljava.lang.Stringってなんですか
-
C#で動的配列Listの中身をListB...
-
初歩的な質問です(配列について)
-
【C#】ハッシュテーブル(連想...
-
Javaのオブジェクトのソート方...
-
Javaで文字と数字が混ざったも...
-
配列をセッションに割り当てた後で
-
JavaBeansの配列の値取得方法に...
-
多次元配列のソートがうまくい...
-
この警告はどうすれば?
-
Javaで文字を漢字であるか否か...
-
エラーのStackTraceをString変...
-
同じ配列またはクラスを、2回...
-
Java・配列の問題です。 int 「...
-
配列を引数にするとき
-
java 大文字と小文字を入れ替える
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaで文字と数字が混ざったも...
-
フローチャート
-
この警告はどうすれば?
-
[Ljava.lang.Stringってなんですか
-
配列で、値の入っている要素数...
-
C#で動的配列Listの中身をListB...
-
配列の中に複数存在する数がい...
-
セッションを使ったint型の値の...
-
【C#】ハッシュテーブル(連想...
-
javaについて
-
javaでの文字列からの数字抽出
-
配列について
-
javaで大容量テキストファイル...
-
配列数を超えてアクセスしたと...
-
【Ajax通信&Java】配列の受け取...
-
『args[]』とは?
-
ArrayListからBean配列に値をセ...
-
C言語でunsigned char配列を連...
-
strutsで2次元配列をやりとりす...
-
javamailで複数人にメールを送...
おすすめ情報