重新排序任意整数数组
我有一个方法接受一个整数数组作为参数,我只是改变其值的顺序任意
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),如果它是你想要的,或者返回一个具有相同大小的新数组,或者将它移动到位。