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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

5回答

2132閲覧

javaでヒットアンドブロー

-Akane-

総合スコア5

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/01/05 03:04

編集2020/01/05 03:07

javaでヒットアンドブローのプログラム描いてます。

大学の単位に関わるので教えて頂きたいです!

課題の条件として、以下の方法で重複しない4桁の数字を生成することが必要です。

  1. 10個の配列に0~9までをいれる
  2. 0~9までの乱数で1の位の数字を決める
  3. 決めた数字を配列の初めの数字と入れ替える
  4. 1~9までの乱数で10の位の数字にする
  5. 決めた数字を配列の2番目の数字と入れ替える
  6. 2~9までの乱数で100の位の数字にする
  7. 決めた数字を配列の3番目の数字と入れ替える
  8. 3~9までの乱数で1000の位の数字にする

いろいろ調べてはみたものの、どのサイトを見ても、同じ方法でやっている物はないように見えたので、質問させて頂きました。

こんな感じで作ったのですが、重複してしまいます。

//10個の配列を作る int [] ans = {0,1,2,3,4,5,6,7,8,9}; String [] name = {"0","1","2","3","4","5","6","7","8","9"}; //千の位を持ってくる。 Random rand1 = new Random (); int sen = rand1.nextInt(9); int a = ans[sen]; //交換 ans[sen]= ans[0]; ans[0] = a; //1から9のansを取り出す int [] ans2 = new int [9]; System.arraycopy(ans,1, ans2,0,9); //百の位を持ってくる。 Random rand2 = new Random (); int hyaku = rand2.nextInt(8); int b = ans2[hyaku]; //交換 ans2[hyaku]= ans2[0]; ans2[0] = b; //2から9のansを取り出す int [] ans3 = new int [8]; System.arraycopy(ans2,1, ans3,0,8); //十の位を持ってくる。 Random rand3 = new Random (); int zyuu = rand3.nextInt(7); int c = ans3[zyuu]; //交換 ans3[zyuu]= ans3[0]; ans3[0] = c; //3から9のansを取り出す int [] ans4 = new int [7]; System.arraycopy(ans3,1, ans4,0,7); //一の位を持ってくる。 Random rand4 = new Random (); int iti = rand4.nextInt(6); int d = ans4[iti]; //交換 ans[iti]= ans4[0]; ans4[0] = d; //4桁持ってくる System.out.println(ans[sen]+""+ans2[hyaku]+""+ans3[zyuu]+""+ans4[iti]);

よろしくお願い申し上げます。。

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

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

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

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

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

jimbe

2020/01/05 03:56 編集

コードは, 入力枠の上辺にある <code> を押すと出てくる ``` の間の "コード" という文字列を置き換える形で記入(コピペ)してください. その際, "ここに言語を入力"という文字列を "java" に置き換えますと, java 言語のキーワード等のフォントが変わる等して見易くなります. また, コードは実行できる状態で記述してください. 省略されますと, 回答側で実行するために追加したコードによっては, 再現しない場合があります. なお, 「単位に関わる」からと急かされても回答側には関係ないことはご留意頂いたほうが宜しいかと思います. > どのサイトを見ても、同じ方法でやっている物はないように見えた コードの書き方は人それぞれです. 同じ授業を受けた同じレベルの方が同じ課題をやっても同じ方法となるとは限りません. だからこそ, ただコードを書くだけでなく, 人のコードを読んで理解することもまたプログラミングには必要と思います.
-Akane-

2020/01/05 06:18

ご指摘頂き有り難うございます。 teratailの使い方等未熟な部分が多くあり、ご迷惑をお掛けして申し訳ありません。 また、私の事情や浅学さについての客観的なご意見も頂き有り難うございます。 今後、質問等させて頂く際に参考にさせて頂きます。 この度は誠にありがとうございました。
-Akane-

2020/01/05 06:22

ご回答頂いた皆様、本当に有り難うございます。 皆様のご意見を比較しながら、頑張ってみようと思います。 この度は誠にありがとうございました。
guest

回答5

0

以下の方法で重複しない4桁の数字を生成すること

には配列のコピーは入っていません.
そもそもコピーしなくて済む方法が書かれています.
方法通りなら以下のようになるのではないでしょうか.

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 Random rand = new Random(); 6 7 //1. 10個の配列に0~9までをいれる 8 int [] ans = {0,1,2,3,4,5,6,7,8,9}; 9 10 //2. 0~9までの乱数で1の位の数字を決める 11 int i = rand.nextInt(10); //0~9 12 int iti = ans[i]; 13 //3. 決めた数字を配列の初めの数字と入れ替える 14 ans[i] = ans[0]; 15 ans[0] = iti; 16 17 //以下略 18 } 19}

投稿2020/01/05 04:24

編集2020/01/05 04:27
jimbe

総合スコア12625

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

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

-Akane-

2020/01/05 06:23

ご意見を頂き有り難うございます。 参考にさせて頂きます。
momon-ga

2020/01/07 02:20

jimbeさん以外のかたのコードは前提条件の > 課題の条件として、以下の方法で重複しない4桁の数字を生成することが必要です。 を無視してるんですよね・・・ 質問者は、わかってるのかしら?
jimbe

2020/01/07 04:18

課題ということですから「どこまで回答するか」ですね. 質問に提示されたコードも条件を満たしているとは言い難いですので, まぁ「参考に」して頂けるようですし, 多少間違ったコードを提出されてもそれはそれで経験になるのではないでしょうか. (と前向きに^^;)
guest

0

java

1 Random r = new Random(); 2 int[] d = new int[4]; 3 for (int i = 0; i <d.length; i++) { 4 d[3-i] = r.nextInt(10-i)+i; 5 for (int j = 0; j < i; j++) { 6 if (d[3-i] == d[3-j]) { 7 i--; 8 break; 9 } 10 } 11 } 12 System.out.println(Arrays.toString(d));

こんなかんじやろな、
1つ目のループ:桁数
2つ目のループ:重複チェック
あえて上記以外はコメントを入れないが読んで詰まったらコメントする(正し課題のため2月以降かな、理解できないのに単位とれるのはおかしいから)

投稿2020/01/05 04:11

編集2020/01/05 04:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

-Akane-

2020/01/05 06:23

ご意見を頂き有り難うございます。 参考にさせて頂きます。
guest

0

課題ということなのでヒントだけ

ちょっと勘違いされているようですが、配列をコピーする必要はありません。
同じ配列ans[]に対して1~8の操作をする想定だと思います。
結果の表示は
System.out.println(ans[3] + "" + ans[2] + "" + ans[1] + "" + ans[0]);
このようになるはずです(私のほうが勘違いしていなければ^^;

あとint sen = rand1.nextInt(9);は、9にはなりません(0~8)
Randomのインスタンスは使いまわせますので、何度もnewする必要はありません。

投稿2020/01/05 04:16

TN8001

総合スコア9315

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

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

-Akane-

2020/01/05 06:23

ご意見を頂き有り難うございます。 参考にさせて頂きます。
guest

0

ベストアンサー

もっと処理を単純化してはいかが?
Random() を毎回作る必要はないですよ。

java

1import java.util.Random; 2 3public class Main { 4 public static void main(String[] args) { 5 //10個の数列から4個の数をランダムに選ぶ 6 int[] digits = {0,1,2,3,4,5,6,7,8,9}; 7 int[] ans = new int[4]; 8 Random rand = new Random(); 9 10 //千の位を選ぶ 11 int sen = rand.nextInt(10); 12 ans[0] = digits[sen]; 13 digits[sen] = digits[9]; 14 15 //百の位を選ぶ 16 int hyaku = rand.nextInt(9); 17 ans[1] = digits[hyaku]; 18 digits[hyaku] = digits[8]; 19 20 //十の位を選ぶ 21 int zyuu = rand.nextInt(8); 22 ans[2] = digits[zyuu]; 23 digits[zyuu] = digits[7]; 24 25 //一の位を選ぶ 26 int iti = rand.nextInt(7); 27 ans[3] = digits[iti]; 28 29 //選んだ4個の数を表示 30 System.out.println("" + ans[0] + ans[1] + ans[2] + ans[3]); 31 } 32}

投稿2020/01/05 03:52

編集2020/01/05 04:30
shiracamus

総合スコア5406

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

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

退会済みユーザー

退会済みユーザー

2020/01/05 04:15

1000の位は3-9で0ははいらないがこのコードはいるよな
shiracamus

2020/01/05 04:26

質問のコードが int sen = rand1.nextInt(9); になってます。
-Akane-

2020/01/05 06:23

ご意見を頂き有り難うございます。 参考にさせて頂きます。
jimbe

2020/01/05 08:38

3~9 なのは配列のインデックスですので, 交換によって千の位に "0" が入ることはありえますし, そうなってはいけないという条件は無いように思います.
guest

0

「フィッシャー-イェーツのシャッフル」を調べてみてください。

投稿2020/01/07 02:52

swordone

総合スコア20651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問