将值分配给Int Array(不重复!)

时间:2013-01-28 15:40:54

标签: c#

我需要随机为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)。我做错了什么?

5 个答案:

答案 0 :(得分:4)

您的逻辑稍微偏离 - 如果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;
}

答案 1 :(得分:2)

如果条目已存在,则跳过条目,这就是为什么它们为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;
}

虽然性能更高(交易内存与循环超过numbers)意味着生成N个不同的随机数:

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;

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你可以做这样的事情,虽然它不一定是性能最好的:

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

答案 4 :(得分:-1)

另一种看待这种情况的方法是随机播放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
                }

取自here

的代码示例