うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【C#】配列をシャッフルしたり、ランダムに取得する

コード

using System.Collections.Generic;

public static class IListExtension
{
    /// <summary>
    /// ランダムに1つ取得
    /// </summary>
    public static T GetRandom<T>(this IList<T> self)
    {
        if (self.Count <= 0)
            return default;
 
        return self[Random.Range(0, self.Count)];
    }
     
    /// <summary>
    /// 中身をシャッフル
    /// </summary>
    public static void Shuffle<T>(this IList<T> self)
    {
        if (self == null || self.Count <= 1)
            return;
   
        for (var i = self.Count - 1; i > 0; i--)
        {
            var j = Random.Range(0, i);
            var tmp = self[i];
            self[i] = self[j];
            self[j] = tmp;
        }
    }
}

サンプル

f:id:hacchi_man:20200311010043p:plain

using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;

public class SampleEditorWindow : EditorWindow
{
    private List<int> _list = new List<int>
    {
        1, 2, 3, 4, 5, 6, 7
    };

    private void OnGUI()
    {
        if (GUILayout.Button("Shuffle"))
        {
            _list.Shuffle();
            Debug.Log("Shuffle:" + string.Join(", ", _list.Select(l => l.ToString())));
        }
        if (GUILayout.Button("Random"))
        {
            Debug.Log("Random:" + _list.GetRandom());
        }
    }
}