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

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

ただいまの
回答率

88.93%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 269

nine_fish397

score 7

タイトル通り現在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;
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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

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

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

import java.util.Random;

public class shufflecheck {
    public static void main(String args[]) {
        int n = 11;

        int[] indexes = getShuffledIndexes(n);

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/24 22: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文を使わずできるのですか?最後に教えていただきたいです。本当に数日にわたってのご回答ありがとうございました、まだまだ勉強不足だとわかったので今作っているアプリを一旦最後にまたインプットをメインにしたいと思います。それとベストアンサーに選ばさせてもらいます。長文失礼いたしました。

    キャンセル

  • 2020/07/25 07:44

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

    キャンセル

  • 2020/07/25 15:40

    ありがとうございます。

    キャンセル

-2

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/21 23:45 編集

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

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る