質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2734閲覧

ランダムに出力した値を使用して、値の加算を行う。

ryuxx

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/08/12 23:07

編集2019/08/13 00:21

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
コマンドライン引数から入力した数が加算の結果となり、
数値の組み合わせをコンソールに出力するプログラムを作成。

【条件】
・加算の対象となる数値は1〜15まで、10個、ランダムにプログラム中で選択する。
・加算は、ランダムに選択した数値と数値を加算してその結果がコマンドライン引数の値と一致するようにする。

(例)
引数:10
ランダムに選択した数値:1,11,5,4,9,3,7,10,2,14

1+9が10となるので、1パターンを出力する。

・コンソールに出力する内容は下記になる。
引数:10
選択した数値:1,11,5,4,9,3,7,10,2,14
結果:1+9

・選択した数値の加算で結果の組み合わせがない場合は、
結果:なし
出力する

エラーは現在ないですが、ランダムに値を出力した際に、
ランダムデータが重複してしまうため、
重複しないデータを取得したい場合にどのようにコーディングすればいいのか教えてください。

いろんな書き方があると思うので、参考にしたい為ご教示ください。
よろしくお願いします。

該当のソースコード

Java

1public class selectAdd { 2 /** 3 * mainメソッド. 4 * 5 * @param args コマンドライン引数 6 * @return result 結果 7 */ 8 public static void main(String[] args) { 9 10 String str = args[0]; // コマンドライン引数 11 try { 12 int num = Integer.parseInt(str); // stirng→int変換 13 Random random = new Random(); // randomクラスの生成 14 ArrayList<Integer> list = new ArrayList<>(); 15 for (int i = 0; i < num; i++) { 16 17 int randNum = random.nextInt(15) + 1; // 対象の数値 18 System.out.println(randNum); 19 } 20 21 } catch (NumberFormatException e) { 22 System.out.println("数値を入力してください。"); 23 24 } 25 26 } 27}

試したこと

~~listを使用して、~~listの中に格納して重複しないか判別を行ったりと試行錯誤しているのですが、必ず、重複したデータが出力されてしまう。

補足情報(FW/ツールのバージョンなど)

Java8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

値の順そのものをランダムに並び替える他, 値の取り出しをランダムにする方法もあります.
その際, 2回以上取り出すのを防ぐため, 取り出した値は削除していきます.

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 Random random = new Random(); 6 Numbers numbers = new Numbers(15); 7 8 for(int i=0; i<10; i++) { 9 int randNum = numbers.get(random); 10 System.out.println(randNum); 11 } 12 } 13 private static class Numbers { 14 private int numbers[]; 15 private int length; 16 Numbers(int size) { 17 if(size <= 0) throw new IllegalArgumentException("size must be 1 or more."); 18 numbers = new int[size]; 19 for(int i=0;i<size; i++) numbers[i]=i+1; 20 length = size; 21 } 22 int getLength() { return length; } 23 int get(int index) { 24 if(length == 0) throw new IllegalStateException("No NUMBER."); 25 if(index < 0 || index >= length) { 26 throw new IndexOutOfBoundsException("index from 0 to "+(length-1)+": index="+index); 27 } 28 int v = numbers[index]; 29 length --; 30 for(int i=index; i<length; i++) numbers[i] = numbers[i+1]; 31 return v; 32 } 33 int get(Random random) { 34 return get(random.nextInt(getLength())); 35 } 36 } 37}

投稿2019/08/14 00:09

編集2019/08/14 00:22
jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

そもそもの例だと、10は、1+9の他に3+7もあるんじゃなかろうかという話はおいといて・・・

エラーは現在ないですが、ランダムに値を出力した際に、

ランダムデータが重複してしまうため、
重複しないデータを取得したい場合

簡単なのがコレクションのシャッフルを利用するのがいいと思います。
今回の場合、1~15を格納したリストをシャッフルして先頭から10個とりだせば良いです。

あとは、Setに規定の個数になるまで乱数を生成しまくるとかありますが、今回のケースでは重複する
可能性が高いので、シャッフルの方がよいかと思います。

伝わると思って、カタカナで書いてしまいましたがCollections#shuffleを使うことで実現できます。

使い方は最初にはったリンク先にも書いてありますし、そのままなので悩まないかと思います。

投稿2019/08/13 00:50

編集2019/08/13 01:15
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryuxx

2019/08/13 00:58

一度シャッフル調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問