在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 数组。


慕姐4208626
浏览 87回答 4
4回答

缥缈止盈

那是因为你试图获得 1-25 之间的数字,所以你的代码永远不会离开循环。你应该像这样随机调用int&nbsp;randomNumber&nbsp;=&nbsp;rnd.Next(1,&nbsp;27);

白衣非少年

实际上,您想随机化整数范围。你可以使用System.LinqRandom rnd = new Random();Enumerable.Range(1, 27).OrderBy(_ => rnd.Next()).NET 小提琴我什至使用 BenchmarkDotNet 测量和比较两个解决方案,尽管我很确定,只是作为确认。测量了两种情况,原始情况和具有 1000 个随机元素的情况。如果增加元素的数量,您可能会看到性能下降(这是合乎逻辑的,因为随着元素数量的增加,您发生碰撞的可能性更高)。BenchmarkDotNet=v0.11.5, OS=Windows 7 SP1 (6.1.7601.0)Intel Core i7-6700 CPU 3.40GHz (Skylake), 1 CPU, 8 logical and 4 physical coresFrequency=3328320 Hz, Resolution=300.4519 ns, Timer=TSC[Host]&nbsp; &nbsp; &nbsp;: .NET Framework 4.6.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.2650.0DefaultJob : .NET Framework 4.6.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.2650.0n=26| Method |&nbsp; &nbsp; &nbsp;Mean |&nbsp; &nbsp; &nbsp;Error |&nbsp; &nbsp; StdDev | Rank ||------- |---------:|----------:|----------:|-----:||&nbsp; &nbsp;Your | 4.463 us | 0.0882 us | 0.1936 us |&nbsp; &nbsp; 2 ||&nbsp; &nbsp;Mine | 2.597 us | 0.0235 us | 0.0220 us |&nbsp; &nbsp; 1 |n=1000| Method |&nbsp; &nbsp; &nbsp; &nbsp;Mean |&nbsp; &nbsp; &nbsp; &nbsp;Error |&nbsp; &nbsp; &nbsp; StdDev | Rank ||------- |-----------:|------------:|------------:|-----:||&nbsp; &nbsp;Your | 6,095.8 us | 119.4976 us | 122.7152 us |&nbsp; &nbsp; 2 ||&nbsp; &nbsp;Mine |&nbsp; &nbsp;148.1 us |&nbsp; &nbsp;0.6086 us |&nbsp; &nbsp;0.5692 us |&nbsp; &nbsp; 1 |

紫衣仙女

将方法的外部保持Random为静态变量可确保您始终获得不同的数字列表,即使您快速连续多次调用该方法也是如此。private static Random StaticRandom = new Random();public static List<int> GetUniqueRandomNumbers_From_1_to_26(){&nbsp; &nbsp; 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

回首忆惘然

作为替代方案,您可以使用MathNet.Numerics库:PM> 安装包 MathNet.Numericspublic static List<int> GetRandom(){&nbsp; &nbsp; var arr = Combinatorics.GeneratePermutation(25);&nbsp; &nbsp; return new List<int>(arr);}您可能需要加 1,因为它会生成从零开始的数组。这是相关文件:通过生成索引号 0 到 N-1 并随机打乱它们来生成随机排列,不重复。使用 Fisher-Yates Shuffling 实现。
打开App,查看更多内容
随时随地看视频慕课网APP