重新排序任意整数数组

时间:2014-08-03 15:21:26

标签: c# arrays random collections hashset

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

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的元素数量并不总是四。

  • 那么,我如何修改我的代码片段来完成我的任务呢?
  • 还有其他办法吗?

4 个答案:

答案 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;
}

这是证据

enter image description here

答案 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),如果它是你想要的东西,要么将它移动到位,要么返回一个新的数组大小