编程新手 我想写一个函数,它返回一个整数数组,其中1000个元素按随机顺序包含值1到1000。
private static void RandomNum()
{
//Initialize an array
int[] randomList = new int[1000];
//Initialize an instance of random class
Random rnd = new Random();
// integer variable
int counter = 0;
while (counter < 1000)
{
//store random num
int random = rnd.Next(1, 1001);
if (Array.IndexOf(randomList, random) <= 0)
{
//store random number into Array
randomList[counter] = random;
counter++;
}
}
//output elements in Array
for (int i = 0; i < 1000; i++)
{
Console.WriteLine(randomList[i]);
}
//output number of elements in Array
Console.WriteLine(counter);
Console.Read();
}
非常感谢任何帮助。
答案 0 :(得分:4)
检查数组random
中是否存在rnd.Next(1, 1001)
生成的randomList
个数字。如果它不存在,则将其存储在randomList
指定的索引中的数组counter
中。
如果您想生成一些随机排序,可以使用一点LINQ:
private static void RandomNum()
{
Random rnd = new Random();
var randomList = Enumerable.Range(1,1000)
.OrderBy(x=>rnd.Next(1,1000))
.ToArray();
foreach(var item in randomList)
{
Console.WriteLine(item);
}
//output number of elements in Array
Console.WriteLine(randomList.Count());
Console.Read();
}
答案 1 :(得分:2)
一个懒惰的人随机排序的方法就是:
Enumerable.Range(1, 1000).OrderBy(x=>System.Guid.NewGuid());
它不一定是良好随机化,但是随机。
另一种更随机,但空间/时间要求稍高的方式是:
var rnd = new Random();
var numbers = Enumerable.Range(1, 1000).ToList();
var randomizedNumbers = new List<int>();
while (numbers.Count > 0)
{
var removeIndex = rnd.Next(0, numbers.Count - 1);
var number = numbers[removeIndex];
randomizedNumbers.Add(number);
numbers.RemoveAt(removeIndex);
}
这只是不断地从第一个列表中提取一个随机数并将其放入一个新的集合中,直到第一个列表为空。
或者,正如其他人所说,最佳方式是使用Fisher-Yates shuffle。