リストの中身を手軽にシャッフルする拡張メゾットを作ります。
カードゲームなど、中身をランダムにさせたいときに使うかも。
ソースコードはこちら。
使い方
通常通りリストを作成し、Shuffle()
を呼び出すだけで完了します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary> シャッフルを行うクラス </summary>
public class ShuffleExample : MonoBehaviour
{
//-----------------------------------------------------------------------
// 変数
//-----------------------------------------------------------------------
/// <summary> 値 </summary>
[SerializeField]
private int _value = 0;
//-----------------------------------------------------------------------
// Unityメゾット
//-----------------------------------------------------------------------
/// <summary>
/// 初期化処理
/// </summary>
private void Start()
{
List<int> list = new();
for (int i = 0; i < 5; i++)
{
list.Add(i);
}
foreach (var value in list)
{
Debug.Log(value);
}
Debug.LogWarning("-----------------------");
list.Shuffle();
foreach (var value in list)
{
Debug.Log(value);
}
}
}
ゆる解説
シャッフルのアルゴリズムにはFisher–Yates shuffleを使用しています。
en.wikipedia.org
配列の末尾から中身を入れ替えていくアルゴリズムです。
図にすると以下のような感じ。
また、最近のUnityのバージョンではタプル型が使用可能です。
この拡張メゾット内では値を入れ替える箇所で使っています。
値の入れ替えでローカル変数を用意しなくてよくなりました。
タプル様様ですね…!
int x = 0;
int y = 1;
// 今までは入れ替える処理を行うときは
// 格納する変数が必要だった
int tmp = x;
x = y;
y = tmp;
int x = 0 ;
int y = 1;
// タプル型を使用すれば一行で終わる
(x, y) = (y, x);
参考サイト
・Fisher–Yates shuffle - Wikipedia
・タプル型 - C# リファレンス | Microsoft Learn