用随机数填充数组

本文关键字:数组 填充 随机数 | 更新日期: 2023-09-27 18:16:53

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

thanks for help

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

用随机数填充数组

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

例如:

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

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循环来修复错误。

"随机"并不意味着唯一。您仍然可以通过使用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);
    }
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);
    for (int i = 0; i < 100; i++)
    {
        Console.WriteLine(arr[i]);
    }
    Console.ReadKey();
}