用随机数填充数组
本文关键字:数组 填充 随机数 | 更新日期: 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();
}