将值分配给 Int 数组(无需重复!

本文关键字:数组 分配 Int | 更新日期: 2023-09-27 17:56:26

我需要随机为具有 1000 个元素的 IntArray 赋值。但这些元素不能重复。我使用了这个代码...

public int[] Numbers()
{
    Random random = new Random();
    int check;
    for (int i = 0; i < numbers.Length; i++)
    {
        check = random.Next(0, 9999);
        while (!numbers.Contains(check))
        {
            numbers[i] = check;
        }
    }
    return numbers;
}

但是,大量的数字将获得默认值 (0)。我做错了什么?

将值分配给 Int 数组(无需重复!

你的逻辑有点不对劲 - 如果 Contains() 失败,你仍然需要分配该索引:

for (int i = 0; i < numbers.Length; i++)
{
    check = random.Next(0, 9999);
    while (numbers.Contains(check))
    {
        // The number existed, so recompute...
        check = random.Next(0, 9999);
    }
    numbers[i] = check;
}

如果条目已经存在,您将跳过它们,这就是它们为 0 的原因。更改while循环:

for (int i = 0; i < numbers.Length; i++)
{
    check = random.Next(0, 9999)
    while (numbers.Contains(check))
    {
        check = random.Next(0, 9999)
    }
    numbers[i] = check;
}

尽管生成N个不同的随机数(在numbers上交换内存与循环)的性能更高:

int ii = 0;
var numbers = new int[N];
var used = new HashSet<int>(); // much faster on lookups than Array.Contains
while (used.Count < N)
{
    var check = random.Next();
    if (used.Add(check)) numbers[ii++] = check;
    // alternatively: if (used.Add(numbers[ii] = check)) ii++;
}
return numbers;

当检查失败时,您跳过一个数字。更改循环,以便在检查失败时在循环继续之前生成一个新数字

你可以做这样的事情,尽管它不一定是性能最高的:

var rnd = new Random();
var result = Enumerable.Range(0, 10000).OrderBy(i => rnd.Next()).Take(1000).ToArray();

另一种看待这个问题的方法是洗牌一个包含 1000 个项目的订单数组你可以使用这样的东西:

        public T[] Shuffle<T>(T[] array)
        {
                var random = _random;
                for (int i = array.Length; i > 1; i--)
                {
                        // Pick random element to swap.
                        int j = random.Next(i); // 0 <= j <= i-1
                        // Swap.
                        T tmp = array[j];
                        array[j] = array[i - 1];
                        array[i - 1] = tmp;
                }
                return array;
        }

然后像那样使用它

                int[] values = new int[1000]
                for (int i=0; i<999; i++)
                   values[i] = i;
                values = Shuffle<int>(values);
                foreach (int item in values)
                {
                        Response.Write(item);
                }
                Response.Write("</br>");
                values = Shuffle<int>(values);
                foreach (int item in values)
                {
                        Response.Write(item); //this will generate a unique random from 0-999
                }

从这里获取的代码示例