这是我的Linq代码,用于生成随机数列表,其中包含10个数字,范围从0到20
Random rand = new Random();
var randomSeq = Enumerable.Repeat(0, 10).Select(i => rand.Next(0,20));
Run Code Online (Sandbox Code Playgroud)
结果:
6
19
18
7
18
12
12
9
2
18
Run Code Online (Sandbox Code Playgroud)
你可以看到我有三个18和两个12 ..
我试过使用Distinct()函数,但它不会填满列表(例如只填写10个数字中的8个)问题:如何生成唯一编号(即不可重复的数字)非常感谢
您希望生成数字0到19的随机排列,并选择其中10个这些数字.用于生成随机置换的标准算法是Fisher-Yates shuffle.生成随机排列后,您可以选择前10个数字.
如果碰撞发生但是它们通常不能具有良好的统计特性,具有不确定的运行时间或甚至在最坏的情况下甚至不能保证终止,那么就不难想出像ad-hoc算法那样重复选择新的数字.
请注意,如果数字的顺序不同,则此解决方案不是一个好的选择.生成数百万以下的数字只能选择10,这不是最聪明的事情.
UPDATE
我刚刚意识到你可以在生成排列的前十个元素之后停止算法 - 不需要构建整个排列.
在函数式编程中,通常会创建无限序列.起初听起来有点奇怪,但在某些情况下它可能非常有用.你有这样的延伸:
public static class EnumerableExtentions
{
public static IEnumerable<T> Infinite<T>(Func<int, T> generator)
{
int count = 0;
checked {
while (true)
yield return generator(count++);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以用它来创建无限的序列,如:
var oddNumbers = EnumerableExtentions.Infinite(n => 2*n + 1)
Run Code Online (Sandbox Code Playgroud)
这是所有奇数的无限序列.我可以只采取前10个,例如:
oddNumbers.Take(10);
Run Code Online (Sandbox Code Playgroud)
会屈服:
1 3 5 7 9 11 13 15 17 19
由于延迟执行,我们得不到StackOverflowException(你必须小心).
可以使用相同的原理创建无限随机序列,区分它然后取前10个:
var r = new Random();
var randomNumbers = EnumerableExtentions
.Infinite(i=> r.Next (0, 20))
.Distinct()
.Take(10);
Run Code Online (Sandbox Code Playgroud)
如果需要,可以在最后创建一个OrderBy(s => s).