RandomUtil.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace GFGGame
  5. {
  6. public static class RandomUtil
  7. {
  8. private static readonly Random TempRandom = new Random();
  9. public static T RandomList<T>(List<T> list)
  10. {
  11. var index = TempRandom.Next(list.Count);
  12. return list[index];
  13. }
  14. public static T RandomArr<T>(T[] arr)
  15. {
  16. var index = TempRandom.Next(arr.Length);
  17. return arr[index];
  18. }
  19. public static T RandomArr<T>(List<T> arr)
  20. {
  21. var index = TempRandom.Next(arr.Count);
  22. return arr[index];
  23. }
  24. //随机一个数 start 包含 end 包含
  25. public static int RandomInt(int start, int end)
  26. {
  27. return TempRandom.Next(start, end + 1);
  28. }
  29. public static int RandomNext(int count)
  30. {
  31. return TempRandom.Next(count);
  32. }
  33. public static T[] RandomN<T>(IEnumerable<T> arr, int n)
  34. {
  35. return arr.OrderBy(x => TempRandom.Next()).Take(n).ToArray();
  36. }
  37. public static T[] RandomNExtra<T>(T[] arr, T[] arr1, int n)
  38. {
  39. var list = arr.Except(arr1).ToList();
  40. var count = list.Count;
  41. var needNum = n;
  42. var result = new List<T>();
  43. while (needNum > 0 && count > 0)
  44. {
  45. var index = TempRandom.Next(count);
  46. result.Add(list[index]);
  47. list[index] = list[count - 1];
  48. count--;
  49. needNum--;
  50. }
  51. if (needNum <= 0) return result.ToArray();
  52. var extra = arr.Except(result).OrderBy(_ => TempRandom.Next()).Take(needNum);
  53. result.AddRange(extra);
  54. return result.ToArray();
  55. }
  56. public static int RandomNExtra(int start, int end, List<int> extra)
  57. {
  58. var list = new List<int>();
  59. for (var i = start; i <= end; i++)
  60. {
  61. if (extra.Contains(i)) continue;
  62. list.Add(i);
  63. }
  64. var count = list.Count - 1;
  65. var index = TempRandom.Next(count);
  66. return list[index];
  67. }
  68. public static List<TValue> GetRandomValues<TKey, TValue>(Dictionary<TKey, TValue> dict, int n)
  69. {
  70. return dict.Values.OrderBy(x => TempRandom.Next()).Take(n).ToList();
  71. }
  72. }
  73. }