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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Unity

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

Q&A

解決済

1回答

2664閲覧

Unityでのリストの中身の並び替えのコードについて

pf0yukineko

総合スコア17

C#

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

Unity

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

0グッド

0クリップ

投稿2019/11/11 03:41

Unity(C#)でリスト・配列の中身をランダムに並び替え、ランダムに要素を取得
こちらのページの

リストの中身を並び替え

C#

1public static List<GameObject> Fisher_Yates_CardDeck_Shuffle(List<GameObject> aList,int seed) 2{ 3 4 System.Random _random = new System.Random(seed); 5 6 GameObject myGO; 7 8 int n = aList.Count; 9 for (int i = 0; i < n; i++) 10 { 11 int r = i + (int)(_random.NextDouble() * (n - i)); 12 myGO = aList[r]; 13 aList[r] = aList[i]; 14 aList[i] = myGO; 15 } 16 17 return aList; 18}

この文の

int r = i + (int)(_random.NextDouble() * (n - i));

この部分が毎回違う値になってるということくらいしかわかりません。なぜそうなるかがわからないです。なぜこれでリストの並び替えができるのかヒントでもいいので教えていただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C#

1int r = i + (int)(_random.NextDouble() * (n - i));

ここでは、一度並べ替えを行った要素に関してアクセスしないように配慮した乱数の生成を行っています。
0.0 以上 1.0 未満のランダムな浮動小数点数を返すので

n=7 の時を考えるなら
i=0 の時 r (0 <= r < 7) = 0 + k (0 <= k < 7)
i=1 の時 r (1 <= r < 7) = 1 + k (0 <= k < 6)
...etc

C#

1 myGO = aList[r]; 2 aList[r] = aList[i]; 3 aList[i] = myGO;

ここでは、空の変数を宣言しておくことで一時的な保管場所を作っておき
要素の入れ替えを行っています。

myGO=空(null) aList[r]=2 aList[i]=5 の時を考える。
入れ替え結果は aList[r]=5 aList[i]=2 としたいはずなので

myGO = aList[r] // myGO=2, aList[r]=2, aList[i]=5
aList[r] = aList[i] // myGO=2, aList[r]=5, aList[i]=5
aList[i] = myGO // myGO=2, aList[r]=5, aList[i]=2

投稿2019/11/11 04:37

編集2019/11/11 05:59
mhmmic1

総合スコア27

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

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

YAmaGNZ

2019/11/11 05:02 編集

n=7であれば取りえる値は i=0:0<=r<7(kは1*7未満) i=1:1<=r<7(kは1*6未満) なのでは?
mhmmic1

2019/11/11 05:56

おっしゃる通りです。 指摘していただきありがとうございます。訂正しておきます。
pf0yukineko

2019/11/11 16:39

なるほど理解できました! 全要素がy個のときにi=xのとき x番目の要素からk(0<=k<y-x)個先の要素と入れ替えるということですね。 YAmaGNZさんもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問