others - 在C#中得到整数数组的随机列表


public static List<int> GetRandom()


{


 Random rnd = new Random();


 List<int> list = new List<int>();



 while (list.Count <= 26)


 {


 int randomNumber = rnd.Next(1, 26);



 if (!list.Contains(randomNumber))


 {


 list.Add(randomNumber);


 }


 }



 return list;


}



这是一个代码,我试图获得一个整数(从1到26)的随机列表,但是,它不会返回我所需的结果, 这里我想要一个没有任何重复的随机的int数组。

时间:

因为你试图在1 -25之间获取数字,所以,你的代码永远不会离开循环, 你应该像这样调用random


int randomNumber = rnd.Next(1, 27);



实际上你想随机的改变整数的范围, 你可以使用 System.Linq 执行这个操作 :


Random rnd = new Random();


Enumerable.Range(1, 27).OrderBy(_ => rnd.Next())



.NET Fiddle

作为替代方法,你可以使用"MathNet.Numerics"库:

PM> Install-Package MathNet.Numerics


public static List<int> GetRandom()


{


 var arr = Combinatorics.GeneratePermutation(25);


 return new List<int>(arr);


}



你可能需要添加1,因为它生成基于零的数组。

以下是相关的文档

通过生成索引号0到N-1,并且随机地对它们进行混淆,生成随机排列而不重复 , 使用Fisher-YatesShuffling实现。

使Random以静态变量保持不变,确保你总是得到不同的数字列表,即使在快速连续调用方法,


private static Random StaticRandom = new Random();



public static List<int> GetUniqueRandomNumbers_From_1_to_26()


{


 return Enumerable.Range(1, 26).OrderBy(_ => StaticRandom.Next()).ToList();


}



用法示例:


Console.WriteLine(String.Join(",", GetUniqueRandomNumbers_From_1_to_26()));



输出:


26, 19, 22, 24, 16, 20, 5, 1, 8, 6, 10, 14, 13, 18, 15, 12, 25, 2, 4, 9, 21, 7, 23, 11, 3, 17



...