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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

1752閲覧

乱数で表示させる質問を重複させたくない

nine_fish397

総合スコア8

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/07/21 14:06

編集2020/07/22 16:10

タイトル通り現在AndroidStudioでString qを r = new Random().nextInt(q.length);
((TextView) findViewById(R.id.situmon)).setText(q[r]);
でランダムに表示させているのですがこれだと同じ問題が何回も表示されます。なのでこの質問qを乱数で表示させつつ兆宇服させない方法を教えてもらえると幸いです。お願いいたします。

コード public class shindan extends AppCompatActivity { String[] q = { "質問1", "質問2", "質問3", "質問4", "質問5" "質問6", "質問7", "質問8", "質問9", "質問10", "質問11" }; String[] ta = {//回答 "1","2","3","4","5","6","7","8","9","10","11" };//+ String[] ba = {//回答 "1","2","3","4","5","6","7","8","9","10","11" };//- int r = 0;//乱数の保管 int count = 10;//問題数 int score=0;//スコア int n = 11; int[] indexes = getShuffledIndexes(n); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shindan); r = new Random().nextInt(q.length); ((TextView) findViewById(R.id.situmon)).setText(q[r]); displayTop(); displayBottom(); for (int i = 0; i < n - 1; i++) { System.out.print(indexes[i] + ", "); } System.out.println(indexes[n - 1]); } public static int[] getShuffledIndexes(int n) { if (n <= 0) { return null; } int[] indexes = new int[n]; for (int i = 0; i < n; i++) { indexes[i] = i; } Random rand = new Random(); for (int i = n - 1; i >= 1; i--) { int j = rand.nextInt(i + 1); int tmp = indexes[j]; indexes[j] = indexes[i]; indexes[i] = tmp; } return indexes; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

0からq.length - 1までの整数の配列を作成し、これをシャッフルして、得られた配列の値をインデックスとして順番に出題すればいい。

シャッフルには、有名なアルゴリズムがあるので「フィッシャー・イエーツ」(Fisher-Yates)で検索してください。

追加分: こんな感じの「0から問題数-1までの整数値がシャッフルされた配列XXX」を開始時に作成しておき、出題時には「配列XXXの残り問題数(count)をインデックスとする要素から整数値を取得し、それを問題や解答のインデックスとして使う」ようにすればいいのでは。

Java

1import java.util.Random; 2 3public class shufflecheck { 4 public static void main(String args[]) { 5 int n = 11; 6 7 int[] indexes = getShuffledIndexes(n); 8 9 for (int i = 0; i < n - 1; i++) { 10 System.out.print(indexes[i] + ", "); 11 } 12 System.out.println(indexes[n - 1]); 13 14 } 15 16 public static int[] getShuffledIndexes(int n) { 17 if (n <= 0) { 18 return null; 19 } 20 int[] indexes = new int[n]; 21 for (int i = 0; i < n; i++) { 22 indexes[i] = i; 23 } 24 25 Random rand = new Random(); 26 27 for (int i = n - 1; i >= 1; i--) { 28 int j = rand.nextInt(i + 1); 29 int tmp = indexes[j]; 30 indexes[j] = indexes[i]; 31 indexes[i] = tmp; 32 } 33 34 return indexes; 35 } 36}

投稿2020/07/21 14:17

編集2020/07/22 13:29
Daregada

総合スコア11990

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

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

nine_fish397

2020/07/21 16:19

List<String> q= new ArrayList<>(Arrays.asList("質問1","質問2","質問3")); Collections.shuffle(q);いろいろサイトを確認しました。まずArrayListで配列を作ってCollections.shuffleで配列をシャッフルすることが分かったのですが基本javaのやり方しか乗ってなくこのあとどうやってTextViewに質問を表示するかがわからないです
Daregada

2020/07/21 22:36

ええと、新たなリストを作らなくてもいい方法を提示したのですが、「シャッフル」しか見えてないのでしょうか。
nine_fish397

2020/07/22 12:47 編集

ええと、どうやって配列を作って得られた配列の値をインデックスとして順番に出題するのでしょうか?と質問するべきでした。すみません「シャッフル」しか見えていなくて。
nine_fish397

2020/07/22 16:15

現在AndroidStudioに上記のコードにDaregadaさんのコードを追加しましたが入れ方が間違えているので、どこにDaregadaさんのコードを追加すればいいのか教えていただけないでしょうか?質問攻めばっかりで失礼しました。面倒だと思ったら無視で全然大丈夫です。
Daregada

2020/07/22 16:31

r = new Random().nextInt(q.length); ((TextView) findViewById(R.id.situmon)).setText(q[r]); を ((TextView) findViewById(R.id.situmon)).setText(q[indexes[count]]); に、同様に次の問題を出す箇所も修正すると、countの値が10から0に減る間、indexesに入っているシャッフルされた0から10の値がひとつずつ使われる。 あと、動作確認用のコードは消しとけ。 for (int i = 0; i < n - 1; i++) { System.out.print(indexes[i] + ", "); } System.out.println(indexes[n - 1]);
xebme

2020/07/23 07:28

アルゴリズムは、フィッシャー–イェーツのシャッフルではなく、リチャード・ダステンフェルドの改良版ですね。わかっていて書いていると思いますが ... 。
Daregada

2020/07/23 07:36 編集

ええ、本当は質問者にアルゴリズムを検索して自分で作ってほしかったので、Wikipediaなどで検索しやすい名前を提示しました。回答のコードは後から追加したものです。
nine_fish397

2020/07/23 12:36

ありがとうございます。最新の回答を得られてからずっと考えて、やっとのこと問題が重複しないようにすることができました。ただ、それと同時にif文の条件式をどうすれば問題に合わせられるかがわからなくなってしまいました。今まではif(乱数q.lengthのr==0)という条件式の元で回答文を問題文に合わせていたのですがif(count==0)だと問題文と回答が合わなくif(n==0)だとそもそも問題文が表示しなく、どういう条件式を書けば問題文と回答文が合わせられるかを教えてもらえないでしょうか。
Daregada

2020/07/23 21:52

if文はいらない。 countが10のとき、indexes[10]の値を使ってba[indexes[10]]やta[indexes[10]]を表示させ、 countが9のとき、indexes[9]の値を使ってba[indexes[9]]やta[indexes[9]]を表示させ、 としていけばいい。
nine_fish397

2020/07/24 13:26

ありがとうございます。おかげ様で質問が重複しないかつ、回答のテキストも問題に応じての変更をすることができました。ただ、私はif (count == 0) { ((TextView) findViewById(R.id.top)).setText(ta[indexes[0]]); ((TextView) findViewById(R.id.bottom)).setText(ba[indexes[0]]); とこのようにif文を使っています。Daregadaさんのおっしゃるif文を使わない方法が知りたいです。countが10ときに~を表示する。みたいな条件式をif文switch文を使わずできるのですか?最後に教えていただきたいです。本当に数日にわたってのご回答ありがとうございました、まだまだ勉強不足だとわかったので今作っているアプリを一旦最後にまたインプットをメインにしたいと思います。それとベストアンサーに選ばさせてもらいます。長文失礼いたしました。
Daregada

2020/07/24 22:44

((TextView) findViewById(R.id.top)).setText(ta[indexes[count]]); ((TextView) findViewById(R.id.bottom)).setText(ba[indexes[count]]);
nine_fish397

2020/07/25 06:40

ありがとうございます。
guest

0

設問を増やしてください。

行くなら、海か山。
隠れるなら、ドアの裏かベッドの下

これだけしかレパートリーがないのなら、2x2=4種類しか出来ません。

4種類しかないということは、問題を5回出すと、かならず重複が起こるという事です。

サイコロには6つの面しかありません。なので、サイコロを7個振ると同じ目のサイコロが必ず出現します。

乱数を導入したところで、サイコロが7や8の目を出すようにはなりません。
しかし、20面体サイコロを使ったら、著薄くした目が出る確率を下げることが可能です。

投稿2020/07/21 14:39

coco_bauer

総合スコア6915

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

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

nine_fish397

2020/07/21 14:46 編集

すみません、これは少し前のコードで現在は11問の問題ができています。あと、確立を下げるというのは裏を返すと重複の可能性が少なからずあるということなので完全に重複を防ぐことはできないですよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問