C# 获取C中整数数组的随机列表# publicstaticlist GetRandom() { 随机rnd=新随机(); 列表=新列表(); while(list.Count

C# 获取C中整数数组的随机列表# publicstaticlist GetRandom() { 随机rnd=新随机(); 列表=新列表(); while(list.Count,c#,C#,这是因为您试图获取1-25之间的数字,所以您的代码永远不会离开循环。您应该像这样调用random int randomNumber=rnd.Next(1,27); 您也可以使用MathNet.Numerics库: PM>安装软件包MathNet.Numerics publicstaticlist GetRandom() { var arr=组合数学。生成项置换(25); 返回新列表(arr); } 您可能需要添加1,因为它会生成基于零的数组 以下是相关信息: 通过生成 将数字0索引到N-1并随

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

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

您也可以使用MathNet.Numerics库:

PM>安装软件包MathNet.Numerics

publicstaticlist GetRandom()
{
var arr=组合数学。生成项置换(25);
返回新列表(arr);
}
您可能需要添加1,因为它会生成基于零的数组

以下是相关信息:

通过生成 将数字0索引到N-1并随机洗牌。使用 费希尔·耶茨在洗牌


实际上,您想要随机化整数的范围。您可以使用
System.Linq

public static List<int> GetRandom()
{
    var arr = Combinatorics.GeneratePermutation(25);
    return new List<int>(arr);
}


我甚至使用BenchmarkDotNet对两个解决方案进行了测量和比较,尽管我非常确定这一点,作为确认。已经测量了两个场景,一个是原始场景,另一个是包含1000个随机元素的场景。如果增加元素的数量,您可能会看到性能下降(这是合乎逻辑的,因为随着元素数量的增加,发生碰撞的概率更高)

n=26

n=1000


随机
作为静态变量保留在方法之外,可以确保始终获得不同的数字列表,即使您快速连续多次调用该方法也是如此

| Method |       Mean |       Error |      StdDev | Rank |
|------- |-----------:|------------:|------------:|-----:|
|   Your | 6,095.8 us | 119.4976 us | 122.7152 us |    2 |
|   Mine |   148.1 us |   0.6086 us |   0.5692 us |    1 |
输出:

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

我想你想要这个:你的
rnd
应该为应用程序的运行创建一次,而不是在每次调用该方法时创建。你不希望它们只是随机的。你也希望它们是唯一的。@TheodorZoulias-是的,先生,我已经得到了answer@Nishan你有答案,但是你的方法有点低效,因为每次迭代你将有更高的概率生成一个已经存在的数字,因此你的概率将从1/n,2/n…n-1/n…你将浪费一些时间循环,直到你真正生成唯一的数字…要扩展,第一个参数是包含的,但第二个参数是排他的。这意味着第一个参数应该是最低的位置在您所需的数字范围内有一个可解的数字,第二个参数应该是可能的最高数字+1。我认为这也会导致无限循环,因为Nishan正在执行
while(list.Count不会发生anything@Nishan作为测试,您可以将
while
循环条件更改为
while(list.Count<26)
,而不是
@Sam你是对的。它现在正在工作。谢谢你在这里的评论。你能告诉我哪一个是性能方面最好的方法,以及为什么吗?@Nishan性能会下降,因为在
随机过程中。接下来
你可能会发生冲突,所以你浪费了一个循环,在我的建议中,你没有冲突n因此提前时间是平均复杂度n*logn。请参阅更新…了解。谢谢您的时间
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 cores
Frequency=3328320 Hz, Resolution=300.4519 ns, Timer=TSC
[Host]     : .NET Framework 4.6.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.2650.0
DefaultJob : .NET Framework 4.6.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.2650.0
| Method |     Mean |     Error |    StdDev | Rank |
|------- |---------:|----------:|----------:|-----:|
|   Your | 4.463 us | 0.0882 us | 0.1936 us |    2 |
|   Mine | 2.597 us | 0.0235 us | 0.0220 us |    1 |
| Method |       Mean |       Error |      StdDev | Rank |
|------- |-----------:|------------:|------------:|-----:|
|   Your | 6,095.8 us | 119.4976 us | 122.7152 us |    2 |
|   Mine |   148.1 us |   0.6086 us |   0.5692 us |    1 |
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