我有一个方法接受一个整数数组作为参数,我只是改变其值的顺序
public static int[] _game_number = new int[4];
public static int[] _current_number = new int[4];
public static void GetRandomTwentyFour()
{
HashSet<int> nums = new HashSet<int>();
for (int i = 0; i < 4; i++)
{
Random r = new Random();
nums.Add(r.Next(0, 4));
}
List<int> liste = nums.ToList<int>();
_current_number = new int[] { _game_number[liste[0]], _game_number[liste[1]], _game_number[liste[2]], _game_number[liste[3]] };
}
问题是nums
的元素数量并不总是四。
答案 0 :(得分:2)
如果您想随机重新排序,只需使用随机内容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将是更好的选择。
答案 1 :(得分:1)
你可以做这样的事情
public static int[] GetRandomTwentyFour(int[] _game_number)
{
int len = _game_number.Length;
int[] _current_number = new int[len];
List<int> nums = new List<int>();
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;
}
这是证据
答案 2 :(得分:1)
扩展方法怎么样?
public static class ArrayExtensions
{
private static Lazy<Random> random = new Lazy<Random>(() => new Random());
public static IEnumerable<T> GetReorderedElements<T>(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<T>(this T[] input)
{
return GetRandomElements(input).ToArray();
}
}
用法:
_current_number = _game_number.GetReorderedElementsAsArray();
答案 3 :(得分:0)
好吧,只需将4
更改为包含元素数量的变量。
当你在这里时,你可以稍微组织一下。让你的GetRandom...
方法接收数组,检查它的大小(而不是假设它是4),如果它是你想要的东西,要么将它移动到位,要么返回一个新的数组大小