我有点问题。 我想用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();
}
答案 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);
}