Files
MRCC/launcher/PCL-CE/PCL.Core/Utils/RandomUtils.cs
T
xyou f70b061d1a
CI / Go Backend (push) Canceled after 0s
feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块

Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
2026-08-08 14:07:56 +08:00

73 lines
3.0 KiB
C#

namespace PCL.Core.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
/// <summary>
/// 提供随机数和集合随机操作的实用方法。
/// </summary>
public static class RandomUtils {
private static readonly Random _SharedRandom = Random.Shared;
/// <summary>
/// 从集合中随机选择一个元素。
/// </summary>
/// <typeparam name="T">集合元素类型。</typeparam>
/// <param name="collection">要从中选择元素的集合。</param>
/// <returns>随机选择的元素。</returns>
/// <exception cref="ArgumentNullException">当 <paramref name="collection"/> 为 null 时抛出。</exception>
/// <exception cref="ArgumentException">当 <paramref name="collection"/> 为空时抛出。</exception>
public static T PickRandom<T>(ICollection<T> collection) {
if (collection.Count == 0)
throw new ArgumentException("集合不能为空", nameof(collection));
var index = _SharedRandom.Next(collection.Count);
if (collection is IList<T> list)
return list[index];
return collection.Skip(index).First();
}
/// <summary>
/// 生成指定范围内的随机整数(包含 min 和 max)。
/// </summary>
/// <param name="min">范围下限(包含)。</param>
/// <param name="max">范围上限(包含)。</param>
/// <returns>随机整数,范围为 [min, max]。</returns>
/// <exception cref="ArgumentOutOfRangeException">当 <paramref name="min"/> 大于 <paramref name="max"/> 时抛出。</exception>
public static int NextInt(int min, int max) {
return min > max ? throw new ArgumentOutOfRangeException(nameof(min), "最小值不能大于最大值") : _SharedRandom.Next(min, max + 1);
}
/// <summary>
/// 随机打乱列表的元素,返回新列表。
/// </summary>
/// <typeparam name="T">列表元素类型。</typeparam>
/// <param name="list">要打乱的列表。</param>
/// <returns>包含随机顺序元素的新列表。</returns>
/// <exception cref="ArgumentNullException">当 <paramref name="list"/> 为 null 时抛出。</exception>
public static List<T> Shuffle<T>(IList<T> list) {
var result = new List<T>(list);
var n = result.Count;
for (var i = n - 1; i > 0; i--) {
var j = _SharedRandom.Next(0, i + 1);
(result[i], result[j]) = (result[j], result[i]);
}
return result;
}
/// <summary>
/// 原地随机打乱列表的元素。
/// </summary>
/// <typeparam name="T">列表元素类型。</typeparam>
/// <param name="list">要打乱的列表。</param>
/// <exception cref="ArgumentNullException">当 <paramref name="list"/> 为 null 时抛出。</exception>
public static void ShuffleInPlace<T>(IList<T> list) {
var n = list.Count;
for (var i = n - 1; i > 0; i--) {
var j = _SharedRandom.Next(0, i + 1);
(list[i], list[j]) = (list[j], list[i]);
}
}
}