List洗牌和权重选取算法


using System;
using System.Collections.Generic;
using Random = UnityEngine.Random;

public static class IListExtension
{
    // 洗牌
    public static void Shuffle(this IList list)
    {
        for (var i = list.Count - 1; i >= 0; --i)
        {
            var index = Random.Range(0, list.Count);
            var temp  = list[index];
            list[index] = list[i];
            list[i]     = temp;
        }
    }

    // 按权重选取
    public static T SelectByWeight(this IList> list)
    {
        var allWeight = 0;
        foreach (var (weight, _) in list)
            allWeight += weight;

        if (allWeight == 0) return default;

        var value = Random.Range(0, allWeight);
        foreach (var (weight, item) in list)
        {
            if (value < weight)
                return item;

            value -= weight;
        }

        return default;
    }
   
    // 集合的子集
     public List> Subsets(this IList set)
    {
        int n = set.Count, pn = 1 << n;
        List> result  = new List>();
        for (int pm = 0; pm < pn; pm++)
        {
            List temp = new List();
            for (int k = 0; k < n; k++)
            {
                if (((1 << k) & pm) != 0)
                    temp.Add(set[k]);
            }

            result.Add(temp);
        }

        return result;
    }
    
}