List洗牌和权重选取算法

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

public static class IListExtension
{
    // 洗牌
    public static void Shuffle<T>(this IList<T> 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<T>(this IList<Tuple<int, T>> 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<List<T>> Subsets<T>(this IList<T> set)
    {
        int n = set.Count, pn = 1 << n;
        List<List<T>> result  = new List<List<T>>();
        for (int pm = 0; pm < pn; pm++)
        {
            List<T> temp = new List<T>();
            for (int k = 0; k < n; k++)
            {
                if (((1 << k) & pm) != 0)
                    temp.Add(set[k]);
            }

            result.Add(temp);
        }

        return result;
    }
    
}
posted @ 2019-03-23 11:49  Fallever  阅读(757)  评论(0编辑  收藏  举报