• ベストアンサー

java 乱数を並べて重複させない方法

javaのプログラミングについて質問させてください。 まだ勉強し始めの初級者です。 1~25までの乱数を発生させ それらを重複させずに5列×5行に並べたいのですが、 Randomとfor文を使い乱数を発生させる事はできたのですが重複してしまいます。 ネットで調べたらArraylistのcontainsを使う等書いてあったのですが方法が分かりません。 5列×5行というのは ○、○、○、○、○、 ○、○、○、○、○、 ○、○、○、○、○、 ○、○、○、○、○、 ○、○、○、○、○、 という風に並べたいです。(○はすべて違う数字) どなたか分かる方ご教授よろしくお願いします。

noname#198651
noname#198651
  • Java
  • 回答数4
  • ありがとう数14

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

  • ベストアンサー
回答No.4

簡単なのは #2 さんの方法で、 例えば、こんな感じでしょうか。 http://melpon.org/wandbox/permlink/ou1SnFSMRwu6B6Tt 出力例: shuffled: [12, 1, 22, 9, 17, 23, 20, 24, 2, 14, 11, 25, 6, 18, 5, 15, 4, 3, 10, 13, 21, 16, 19, 8, 7] 12 1 22 9 17 23 20 24 2 14 11 25 6 18 5 15 4 3 10 13 21 16 19 8 7

noname#198651
質問者

お礼

他のみなさんも丁寧に教えて頂けたのですが、 コードまで丁寧に教えて頂けたのでベストアンサーにしました。 すごい助かりました!! ありがとうございました!

その他の回答 (3)

  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.3

1. 1~25の25個の数字からランダムで1個取り出す。 2. 1.で取り出した数字を除いた24個の数字からランダムで1個取り出す。 3. 1. 2. で取り出した数字を除いた23個の数字からランダムで1個取り出す。 . . . 25. 最後の1個を取り出す。 26. 取り出した順に5個単位で分ける。

noname#198651
質問者

お礼

教えて頂きありがとうございます! この方法でも自分で考えてやってみたいと思います! ありがとうございました!

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

Listに1~25の数値を格納しておいて Collections.shuffleとかでシャッフルする。 No.1の存在チェックする方法は処理量が多くなるのでお勧めできない。 (でも、なんで良くないのか処理の流れ追って考えてみるのは面白いと思う。)

noname#198651
質問者

お礼

教えてくださいましてありがとうございます。 まだまだ勉強中ですので、また機会がありましたらよろしくお願いします!

  • mayoke
  • ベストアンサー率25% (16/62)
回答No.1

一旦配列に入れて、存在チェックしてからアウトプットするといいんじゃないですか? (1)乱数作成 (2)配列に存在するかチェック (3)存在しなければ配列に登録、存在すれば(1)に戻る (4)アウトプット (5)繰り返し

noname#198651
質問者

お礼

ベストアンサーは他の方にさせてもらったのですが、 すごい勉強になりました。 ありがとうございます!!

関連するQ&A

  • エクセル 任意の数字から始まる重複しない乱数

    お世話になります。 エクセル2003/XP 使用です。 RANK関数またはそれに似た利用方法でご教授願いします。 下記ページを参考に、"重複しない乱数”を作成しました。 http://www.relief.jp/itnote/archives/001798.php (ページ中程、▼操作手順:重複しない乱数を作成する 以下の部分) 乱数の最初の数字が1から始まる分には問題なくできるのですが、 乱数の数字を、「任意の数字から始めて」、 「任意の数字で終わる」ようにすることは可能でしょうか? 例えば、下記の例でいうと、 6から始まり10で終わる乱数です。        A列     B列 1行目 / =RAND() / 1-5の範囲でランダムな重複しない乱数 2行目 / =RAND() / 同上 3行目 / =RAND() / 同上 4行目 / =RAND() / 同上 5行目 / =RAND() / 同上 ------------------------------------------------------------ 6行目 / =RAND() / 6-10の範囲でランダムな重複しない乱数 7行目 / =RAND() / 同上 8行目 / =RAND() / 同上 9行目 / =RAND() / 同上 10行目 / =RAND() /同上 (11以下、繰り返し 略) よろしくお願いします。

  • java 格納した乱数それぞれにボタンを付け配置

    2回目の質問させて頂きます。 java勉強中の初級者です。 前回乱数を重複させずに5行×5列の25個並べる方法を教えて頂きました。 この25個にボタンをつけて最終的にタッチナンバーのゲームを作りたいです。 (ランダムに並んだ数字1~25まで順番に押してくゲーム) 5行×5列のボタンを配置まではできたのですが、 (1)そのボタンそれぞれに毎回違う乱数と紐付ける方法 (2)1~25まで順番に押してく処理 (3)そのボタンにその都度の数字に合わせた画像を付ける方法(押したら押された時用の画像に変わる) 上の3つが今悩んでいて、今回お聞きしたいところです。 (2)はifを使って 『25は24を押した後じゃないと押せない、24は23を押した後じゃないと押せない。』 みたいに一つずつ処理していくのかなぁと言うイメージです。 (合ってるのか効率いいのかもわかりませんが。) (3)はこの数字が来たらこの画像、あらかじめ指定しておくのかな?と言うイメージです。 (これも合ってるのかすらわかりません。) 前回教えて頂いたソースコードを載せておきます。 import java.util.ArrayList; import java.util.Collections; import java.util.Formatter; import java.util.List; class RandomArray { public static void main(String[] args) { int n = 5; int[][] a = new int[n][n]; List<Integer> shuffled = new ArrayList<Integer>(); // initialize for (int i = 0; i < n * n; i++) shuffled.add(i + 1); // shuffle Collections.shuffle(shuffled); System.out.println("shuffled: " + shuffled); // set int c = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) a[i][j] = shuffled.get(c++); // output StringBuilder sb = new StringBuilder(); Formatter f = new Formatter(sb); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) f.format("%2d ", a[i][j]); f.format("\n"); } System.out.print(f); } } やりかた、考え方でもありがたいのですが、ソースコードも教えて頂けたら大変ありがたいです。 ぜひご教授頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 乱数の重複無しを作りたい

    先回質問させていただき、乱数発生は教えてもらいわかりました。 <html><head><title>乱数発生器</title></head> <body> 1~150の乱数を発生させます。<br> <input type="button" value="発生させる。" onclick="alert( Math.floor( Math.random() * 149 ) + 1 )"> </body></html> これで今まで出た数字は出ないよう(重複しない)ようにしたいです。 どのようにすればいいのでしょうか? 出来れば上記コードふまえたコードを書いていただけると幸いです。 (すみません。JAVA初心者なのでどこに書いたらいいかわかりません) 目的はビンゴゲームのようなくじに使いたいと思います。 ですから人数はその会場に行かないとわからないので、MAXの数字は 自分で書けるようにしたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 重複乱数で処理終了

    java のプログラミングについて質問です。 乱数を発生させ それまでと同じ値が出たら 処理を終了させる。 というプログラムを考えています。 例えば乱数が 1,4,2,6,5,7,9,3,4,3,6,5,4,5,6,7,8,8,9,7,・・・ という順で出た場合 1,4,2,6,5,7,9,3 のみを【表示】させ、処理を終了するというものです。 重複したときに処理を終了する というプログラムが分からない状態です。 分かる方いらっしゃいましたら、ご教授願います。

    • ベストアンサー
    • Java
  • VBで作った乱数を一度も重複させずに表示する方法を教えてください!

    VB2005で乱数を作り、ボタンを押すごとに一つづつその数字がひょうじされるようにしたいのですが、その数字が一度も重複されないようにするにはどうしたらいいのでしょうか? 例えばボタンを百回押すと、1から100までの数字がランダムに、一度も重複されずに表示されるようにするにはどのようなコードを書けばよいのでしょうか?

  • 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); } } }

    • ベストアンサー
    • Java
  • 配列の重複削除について

    データを作るプログラムで、配列の重複を削除したいのです。 配列の中身は乱数を発生させることで作ります。 内容は、 1 1 1 4 2 8 2 10 3 4 4 3 5 2 6 3 8 2 といった感じです。 ルールは、 *一列目と二列目が同じ数字ではだめ *(2 8)と(8 2)、(3 4)と(4 3)は重複しているので一方を削除 *()はつけない です。 プログラミング初心者なので、全くわかりません。 よろしくお願いします。

  • エクセルで数字の重複を防ぐ方法

    CからG列に1から12までの数字をランダムに入力しています。 その数字が重複していると困るので、数字が重複していた場合 H列にエラーメッセージが出るようにしたいのですが、良い方法は 無いでしょうか? 200行くらいまで入力する予定です。 よろしくお願いします。

  • 乱数

    乱数を発生させる際に Sub Sample() Debug.Print Int((10 - 1 + 1) * Rnd + 1) End Sub で、1から10までの乱数を発生できますが、 1から10と言う連続した数字ではなく、 例えば10,13,18,43・・・ という規則性のない複数の数字からランダムに数字を発生させるにはどうすればいいでしょうか? 10,13,18,43の中から10を返したり、18を返したりする方法を教えてください。

  • 乱数の出し方で・・・

    たとえば、39人を乱数を使って並べ替えたいのですが、B列以降に名前や必要な項目を書き、A列に=RAND()を入れそれを使って並び替えるのではなく、1から39までの乱数を重複なしに発生させることはできないのですか???

専門家に質問してみよう