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;
}
}