|
分類:[.NET 全般]
お世話になっております。 C#初心者のサイカクです。 VisualStudioCodeで開発を行っており、versionは1.47です。
昨日、同タイトルで以下のご質問をしました。
=================================== 現在、「0」と「1」で構成された6×6の二次配列を作ろうとしています。 その際、行ごとに「0」を4つ、「1」を2つランダムで格納させたいです。 (列ごとの「0」と「1」の構成はどんな形であれ構わないです) つまり、36個の要素の構成は最終的に「0」が24個、「1」が12個になります。
具体的には
000110 100100 001010 110000 101000 001001
このような二次配列を完成させたいと思っています。 二次配列の作り方や、1次配列の乱数指定方法は存じているのですが、 組み合わせて運用する方法を理解できなかったので、ご質問させていただきました。 ====================================
この質問に対して、「Fisher-Yates」アルゴリズムを使ってはどうか?とアドバイスをいただき、 以下のコードを作成しました。
====================================
public class TestScpirt : MonoBehaviour { int[,] StageData = new int[6,6];
void Start() { LoadStageData(); DebugTable(); }
void LoadStageData() { int[] conbination = new int[6]{1, 1, 0, 0, 0, 0}; System.Random rnd = new System.Random(); for(int n = conbination.Length - 1; n >= 0; n--) { int k = rnd.Next(n + 1); int tmp = conbination[k]; conbination[k] = conbination[n]; conbination[n] = tmp; for(int l = StageData.GetLength(0) - 1; l >= 0; l--) { StageData[l, n] = conbination[l]; } } }
void DebugTable() { for(int y = 0; y < 6; y++) { string debugtext = ""; for(int x = 0; x < 6; x++) { debugtext += StageData[x, y] + ", "; } Debug.Log(debugtext); } } }
====================================
しかし、実際にコンソール画面に表示されるデバッグは
000101 000101 000101 000101 100001 100001
あるいは
101000 101000 010100 010100 110000 110000
といった規則的な二次配列が表示されます。 おそらく、一次配列ごとの「0」と「1」のランダム格納はできているのですが、 出来上がった一次配列を二次配列の行に格納する段階、すなわち
for(int l = StageData.GetLength(0) - 1; l >= 0; l--) { StageData[l, n] = conbination[l]; }
この部分でコードが間違っているのだと思います。
数時間考えてみたのですが、原因が分からず困っています。 長文になってしまい、申し訳ございません。 原因がわかる方がいらっしゃいましたら、ご指導のほどよろしくお願い申し上げます。
|