にしのクエスト2

情報処理技術者試験と資格学校講師の日常

20221224103753

Unityで学ぶプログラミング TIPS (17)重複なし配列の並び替え

今回も、超ミニミニTIPSです。

これ、どっかで書いたことあったっけな?ってくらいメジ
ャーな質問です。

配列の要素に重複しない要素をセットしたい。しかもラン
ダムに。

みたいなやつで、質問箱とかプログラミング質問系のとこ
ではめちゃくちゃ有名な質問です。

やり方の概要としては
1 乱数を発生させる
2 配列に該当の数字がない? あるならやり直し
3 格納する
4 次の要素へ


で、できますが。

あっしは、「配列を作っておいて並び替えちゃえ」作戦
推奨します。(他の人も言ってるけど、乱数は偏るので)

もちろんこれ以外の方法もあるかと思いますが、あくまで
参考まで。(もっとスッキリ書けるかもです)

要するに、こうします


//配列に要素を入れておく
public int Index=new int[10]{0,1,2,3,4,5,6,7,8,9};


for
(int i = 0; i < Index.Length; i++){
  
int temp = Index[i];
int rIndex = Random.Range(0,Index.Length);
Index[i] = Index[rIndex];
Index[rIndex] = temp;
}

解説

//配列に要素を入れておきます
public int Index=new int[10]{0,1,2,3,4,5,6,7,8,9};


//配列の要素の分だけ繰り返す
for (int i = 0; i < Index.Length; i++){

//1 tempに要素を移し替えて

int temp = Index[i];

//要素の個数を最大値とした乱数を発生
int rIndex = Random.Range(0,Index.Length);

//2 乱数で指定した要素を移動させて
Index[i] = Index[rIndex];


//3 そこに保存してあった要素を載せ替える
Index[rIndex] = temp;

}


最初の処理だけ見ておくと
1 Index[0]→ temp  値0がtempに行きます
  乱数が1だとすると、
2 index[0] =index[1]  値1がindex[0]に移動
3 index[1]=temp  index[1]に値0が移動

この場合は要素0と要素1のシャッフルになると
いうわけです。(10234・・・になります)

今日も小ネタですいません。しばらくこんな感じです。

それではよきプログラミングライフを!
またね。