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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

配列

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

Q&A

解決済

1回答

1441閲覧

配列のシャッフルがうまくできません

tsukunemugi

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

配列

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

0グッド

0クリップ

投稿2021/11/25 00:15

編集2021/11/25 01:10

クイズアプリ/C#/Unity/問題文をシャッフルしたい

csvからデータを読み込み、csvの配列通りに問題が出題されるようになっています。
これを重複しないランダムで表示したく、調べたらたくさん出てきたのですが、一通りやってみてもできなかったので質問させていただきます。
現在のスクリプトでは何もエラーは起こっていませんが、シャッフルされず配列通り出題されています。

##やりたいこと
csvの配列を丸ごとシャッフルさせたい。
→初めは問題文だけをシャッフルするようにしましたが、答えの選択肢までシャッフルされることを懸念して、csvの横列をランダムにしたい

##やったこと
"C# 配列 シャッフル"で検索し、画像のように試しました。試した内容はかなりあるのですが、どれも記述の仕方に間違いがありできていないようです。!

/Users/mugisama/Desktop/スクリーンショット 2021-11-19 13.00.57.png

/Users/mugisama/Desktop/スクリーンショット 2021-11-19 16.26.41.png

/Users/mugisama/Desktop/スクリーンショット 2021-11-24 16.19.32.png

/Users/mugisama/Desktop/スクリーンショット 2021-11-25 10.09.39.png

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6using System.Linq; 7using System; 8 9public class CSVScript : MonoBehaviour 10{ 11 public TextAsset CSV; 12 public Text value3, value4, value5; 13 public static int nowIndex = 1; 14 public static string CorrectAnswerText; 15 16 17 //CSVから分解した問題クラスを代入する配列 18 public Question[] questions = new Question[150]; 19 20 public static string QuestionText { get; private set; } 21 22 23 // Start is called before the first frame update 24 void Start() 25 { 26 27 //CSVを各行で区切る 28 string[] csv = CSV.text.Split('\n'); 29 Debug.Log(csv.Length); 30 31 //全ての行の数だけループする(1行目から開始) 32 for (int i = 1; i < csv.Length; i++) 33 { 34 //各行の要素を,で区切る 35 string[] values = csv[i].Split(','); 36 37 //0番目:カテゴリ 38 string category = values[0]; 39 40 //1番目:レベル 41 int level = 0; 42 if (values[1] == "初級") 43 { 44 level = 1; 45 } 46 else if (values[1] == "中級") 47 { 48 level = 2; 49 } 50 else if (values[1] == "上級") 51 { 52 level = 3; 53 } 54 55 //2番目:問題文 56 string questionText = values[2]; 57 58 //3~5番目:選択肢 配列でまとめる 59 //values[3]A values[4]B values[5] 60 string[] answers = { values[3], values[4], values[5] }; 61 62 63 //6番目:正解の配列番号 Aが0、Bが1、Cが2 64 int answerIndex = 0; 65 if (values[6] == "A") 66 { 67 answerIndex = 0; 68 } 69 else if (values[6] == "B") 70 { 71 answerIndex = 1; 72 } 73 else 74 { 75 answerIndex = 2; 76 } 77 78 79 80 //7番目:解説 81 string comment = values[7]; 82 83 Question q = new Question(category, level, questionText, answers, answerIndex, comment); 84 85 //作成したquestionクラスを配列に入れる 86 questions[i] = q; 87 88 } 89 90 //ここでシャッフル 91 System.Random rng = new System.Random(); 92 int n = csv.Length; 93 while (n > 1) 94 { 95 n--; 96 int k = rng.Next(n + 1); 97 string tmp = csv[k]; 98 csv[k] = csv[n]; 99 csv[n] = tmp; 100 } 101 102 questions[nowIndex].ShowLog(); 103 104 GetComponentInChildren<Text>().text = questions[nowIndex].question; 105 value3.text = questions[nowIndex].answers[0]; 106 value4.text = questions[nowIndex].answers[1]; 107 value5.text = questions[nowIndex].answers[2]; 108 } 109 110 111 public void OnClickAnswerButton(int answerIndex) 112 { 113 CorrectAnswerText = questions[nowIndex].GetCorrectAnswerText(); 114 115 if (questions[nowIndex].answerIndex == answerIndex) 116 { 117 SceneManager.LoadScene("correct"); 118 } 119 else 120 { 121 SceneManager.LoadScene("incorrect"); 122 } 123 124 } 125 126 127 // Update is called once per frame 128 void Update() 129 { 130 131 } 132} 133

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

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

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

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

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

BeatStar

2021/11/25 00:38

> 一通りやってみてもできなかった とありますが、『どのようにやったか』を書きましょう。(複数個試しているはずなので) もしかしたら調べ方が悪いのかもしれないし、参考サイトが間違っているかもしれないし、サイトでは間違っていないが条件が一致していないかもしれないし、単純に書き方が間違っているかもしれないし。 それに、プログラミングは『こう書けばいい』と言うものではありません。 ロジックを書くのです。
BeatStar

2021/11/25 00:45

それと、ランダムにしている部分(シャッフル)では『csvのデータ』を変更しているっぽい。 でもやりたいことから考えると、『Questionクラスの配列』の方にアクセスすべきでは?
tsukunemugi

2021/11/25 01:02

内容を一部変更しました。 シャッフルする部分に関してですが、初めはQuestionクラスの配列をシャッフルするよう記述sていたのですが、Questionクラスをシャッフルすると回答選択肢とバラバラになる可能性が出てくると思い、csvごとシャッフルするよう書き換えました。
BeatStar

2021/11/25 01:04 編集

画像が表示されていませんよ?(私の環境だけかな?)
BeatStar

2021/11/25 01:06

必ず質問にある構成でしょうか?(たとえば課題とかみたいに問題文等で定義されている等)
退会済みユーザー

退会済みユーザー

2021/11/25 01:09 編集

> string[] csv = CSV.text.Split('\n'); そもそもそれで期待通り CSV ファイルの各行の配列が取得できているか確認しましたか? 改行は "\r\n" とか、フィールドの中に改行コードが含まれていたらどうなのでしょう? > string[] values = csv[i].Split(','); これも同じく、そもそもこれで各行のフィールドが期待通り取得できるのかか確認しましたか? フィールドの中にカンマ , が含まれていたらどうなるでしょう? 話はそのあたりは問題ないことを確認されてからにした方が良さそうです。
tsukunemugi

2021/11/25 01:12

画像追加しました。 現在csvの配列通りですが、最後の画像の中に文字が格納され、問題なく動いています。
BeatStar

2021/11/25 01:30 編集

@ 質問者さん とりあえずSurferOnWwwさんが仰るようなものを調べてください。(Console.WriteLineメソッド等で)
BeatStar

2021/11/25 01:27

それと、まだ画像が表示されず、ユーザ名が出てますよ…
dodox86

2021/11/25 01:39

既に色々と指摘が出ているのでこれ以上混乱させるつもりはないですが、 > Questionクラスをシャッフルすると回答選択肢とバラバラになる可能性が出てくると思い、 これがまず分かりませんね。Questionクラスの提示が無いので確証はないですが、Questionクラス自体が回答選択肢を持っているのであれば、Questionクラスを要素とする配列をシャッフルしてもバラバラにはならないように思えるのですが。 あれもこれも最初から全部やろうとするのではなく、まず配列の要素のシャッフルはどうやったらよいのかちゃんと理解したあと、今のコードに適用するようにした方が良いように思います。
退会済みユーザー

退会済みユーザー

2021/11/25 05:07 編集

現時点では本題とは直接関係ない話かもしれませんが、CSV ファイルのテキストを改行・カンマで Split するのは止めた方が良いと思います。質問文に改行・カンマが含まれていたらそこで破綻しますよ。 現状でそういうことがあるとすると、質問の話を始める以前の問題があります。 興味がありましたら、以下の記事の「CSV形式とは?」を一読することをお勧めします。 CSV形式のファイルをDataTableや配列等として取得する http://dobon.net/vb/dotnet/file/readcsvfile.html
tsukunemugi

2021/11/25 02:21

みなさまの助言をもとにもう一度調べ直してみます。 ありがとうございます。
guest

回答1

0

自己解決

スクリプトをほぼまるっきり書き換え、フィッシャーイェーツを使ってシャッフルすることができました。たくさんのご助言、ありがとうございました。

投稿2022/01/11 02:31

tsukunemugi

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問