重新排序任意整数数组

我有一个方法接受一个整数数组作为参数,我只是改变其值的顺序任意

public static int[] _game_number = new int[4]; public static int[] _current_number = new int[4]; public static void GetRandomTwentyFour() { HashSet nums = new HashSet(); for (int i = 0; i < 4; i++) { Random r = new Random(); nums.Add(r.Next(0, 4)); } List liste = nums.ToList(); _current_number = new int[] { _game_number[liste[0]], _game_number[liste[1]], _game_number[liste[2]], _game_number[liste[3]] }; } 

问题是, nums的元素数量并不总是四。

  • 那么,我如何修改我的代码段来完成我的任务呢?
  • 还有另一种方法吗?

如果你想随机重新排序它们,只需使用随机事物的OrderBy作为选择器。

通常你可以使用Random.Next()

 public static int[] _game_number = new int[4]; public static int[] _current_number = new int[4]; private static Random random = new Random(); public static void GetRandomTwentyFour() { _current_number = _game_number.OrderBy(r => random.Next()).ToArray(); } 

但是一个新的Guid也可以在这里工作,并为你节省一个私人领域:

 public static int[] _game_number = new int[4]; public static int[] _current_number = new int[4]; public static void GetRandomTwentyFour() { _current_number = _game_number.OrderBy(g => new Guid()).ToArray(); } 

² 请注意,Guids不是“随机”的,而是“独特的”。 但是,由于你可能没有制作一个非常官方的应用程序(银行,在线扑克等),使用IMO是公平的。 对于随机性非常重要的应用程序,来自Cryptography命名空间的RandomNumberGenerator将是更好的选择。

你可以做这样的事情

 public static int[] GetRandomTwentyFour(int[] _game_number) { int len = _game_number.Length; int[] _current_number = new int[len]; List nums = new List(); Random r = new Random(); for (int i = 0; i < len; i++) { int rand = r.Next(0, len); if (nums.Contains(rand)) { i = i - 1; continue; } else nums.Add(rand); } for (int i = 0; i < nums.Count; i++) _current_number[i] = _game_number[nums[i]]; return _current_number; } 

这是certificate

在此处输入图像描述

扩展方法怎么样?

 public static class ArrayExtensions { private static Lazy random = new Lazy(() => new Random()); public static IEnumerable GetReorderedElements(this T[] input) { if (input == null) { throw new ArgumentNullException("input"); } var rnd = random.Value; var nums = input.ToList(); var repeats = unusedNums.Length; while (repeats > 0) { var index_first = rnd.Next(0, nums.Length); var index_second = rnd.Next(0, nums.Length); var temp = nums[index_first]; nums[index_first] = nums[index_second]; nums[index_second] = temp; repeats -= 1; } return new ReadOnlyCollection(nums); } public static T[] GetReorderedElementsAsArray(this T[] input) { return GetRandomElements(input).ToArray(); } } 

用法:

 _current_number = _game_number.GetReorderedElementsAsArray(); 

好吧,只需将4更改为包含元素数量的变量即可。

当你在这里时,你可以组织一些事情。 让你的GetRandom...方法接收数组,检查它的大小(而不是假设它是4),如果它是你想要的,或者返回一个具有相同大小的新数组,或者将它移动到位。