1

我需要为具有 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)。我究竟做错了什么 ?

4

5 回答 5

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;
}
于 2013-01-28T15:44:11.750 回答
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;
于 2013-01-28T15:44:18.770 回答
0

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

于 2013-01-28T15:45:58.307 回答
0

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

var rnd = new Random();
var result = Enumerable.Range(0, 10000).OrderBy(i => rnd.Next()).Take(1000).ToArray();
于 2013-01-28T16:12:07.527 回答
-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
                }

这里获取的代码示例

于 2013-01-28T15:49:27.547 回答