用随机数填充数组

时间:2015-10-09 17:03:46

标签: c# sorting for-loop random console-application

我有点问题。 我想用100个随机数填充我的数组。 问题是我有很多相同的数字我的数组的2/4是0 然后1/4 89,这怎么可能???

感谢您的帮助

public void arrayreverse()
{
    int[] arr = new int[100];
    Random r = new Random();

    for (int i = 0; i < 100; i++)
    {
        int rand = r.Next(0, 100);
        arr[i] = rand;
        Array.Sort(arr);
        Array.Reverse(arr);
        Console.WriteLine(arr[i]);
    }
    Console.ReadLine();
}

3 个答案:

答案 0 :(得分:3)

由于您在循环内对数组进行排序和反转,因此基本上强制最大数字为最后一个。

例如,在5个大小的数组中:

i = 0
arr[i] = rand:
arr -> 5 0 0 0 0

sort and reverse
arr -> 5 0 0 0 0
output = 5

i = 1
arr[i] = rand:
arr -> 5 8 0 0 0

sort and reverse
arr -> 8 5 0 0 0
output = 5

i = 2
arr[i] = rand:
arr -> 8 5 7 0 0

sort and reverse
arr -> 8 7 5 0 0
output = 5

i = 3
arr[i] = rand:
arr -> 8 5 7 2 0

sort and reverse
arr -> 8 7 5 2 0
output = 2

i = 4
arr[i] = rand:
arr -> 8 7 5 2 0

sort and reverse
arr -> 8 7 5 2 0
output = 2

正如您所看到的,您的输出将始终是最小的数字,当您继续时,Random.Next生成的数量越来越少可能小于当前最小数量,因此当前最小数量很可能再次出现作为输出。

如果您想列出100个数字并打印出来,可以使用Linq

(new int[100])
    .Select(x => r.Next(100))
    .ToList()
    .ForEach(x => Console.WriteLine(x));

如果您希望数字不同(0到99之间的所有数字,但您希望它们只出现一次),您可以使用以下代码:

private static Random r = new Random();

public static int[] GetRandomArray(int size)
{
    SortedDictionary<double, int> sortedSet = new SortedDictionary<double, int>();
    for (int index = 0; index < size; index++)
    {               
        sortedSet.Add(r.NextDouble(), index);
    }
    return sortedSet.Select(x => x.Value).ToArray();
}

答案 1 :(得分:2)

LINQ更容易做对:

var randomNumbers = 
      Enumerable.Range(0, 100) // create sequence of 100 elements
      .Select(_ =>r.Next(0,100)) // for each element select random value
      .ToArray(); // convert to array.

至于你当前的样本 - 从for循环中移出排序来修复bug。

答案 2 :(得分:2)

&#34;随机&#34;并不意味着独特。您仍然可以使用set:

来实现预期的行为
    var takenNumbers = new SortedSet<int>();

    while (takenNumbers.Count != 100)
    {
        takenNumbers.Add(r.Next(0, 100));
    }

    var array = takenNumbers.ToArray();

然而,接缝是你想要建立一个独特的序列,而不是一个集合。

以下是构建序列的代码:

    var takenNumbers = new HashSet<int>();

    var array = int[100];
    while (takenNumbers.Count != 100)
    {
        int rand = r.Next(0, 100);
        if (takenNumbers.Add(rand))
        {
           array[takenNumbers.Count - 1] = rand; 
        }
    }

    foreach(var number in arr)
    {
       Console.WriteLine(number);
    }