C# 用随机数填充数组

C# 用随机数填充数组,c#,sorting,for-loop,random,console-application,C#,Sorting,For Loop,Random,Console Application,我有个小问题。 我想用100个随机数填充我的数组。 问题是我有很多相同的数字,数组的2/4是0 那么1/489,这怎么可能呢 谢谢你的帮助 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

我有个小问题。 我想用100个随机数填充我的数组。 问题是我有很多相同的数字,数组的2/4是0 那么1/489,这怎么可能呢

谢谢你的帮助

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();
}

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循环中移出以修复错误。

随机并不意味着唯一。您仍然可以通过使用以下集合实现预期行为:

    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);
    }

由于在循环中对数组进行排序和反转,因此基本上强制将最大的数字排在最后

例如,在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
如您所见,您的输出将始终是最小的数字,并且随着您的继续,随机生成的数字会越来越少。下一个数字可能会小于当前最小的数字,因此当前最小的数字很可能会再次显示为输出

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

如果希望数字不同,则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();
}

在循环中对数组进行排序。这就是问题所在。我同意@JamesKPolk。由于在每次迭代中执行的排序,您正在覆盖条目。虽然排序会导致性能问题,但这并不能说明Random在紧循环中不能很好地工作。它主要基于计算机时间,因此在紧密循环中创建的值很可能具有重复值。这在数学上对我来说很有趣。你不会得到像你认为的那样多的重复值。排序和反转数据后,您将转储索引。您将始终以编码的方式打印数组中的最小值。运行“获取重复项”注释出数组。Sortarr&&数组。reversear您将看到您将获得随机数,但是会有一些重复的数字,但不会像所有排序和反向代码那样多..我想他想要重复?也许你需要再读一遍这个问题OP清楚地说明了以下内容我想用100个随机数填充我的数组。问题是我有很多相同的numbers@recursive我认为它是50%的零,因为代码总是打印到目前为止找到的最低数字。@kame:是的,这就是我想说的。这意味着50%的零并不奇怪。这是人们所期望的。
(new int[100])
    .Select(x => r.Next(100))
    .ToList()
    .ForEach(x => Console.WriteLine(x));
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();
}