我需要以随机顺序打印1
到n
的数字。我通过使用System.Random
实现了这一点,但结果是数字范围为1-5。我想随机化这个范围内的所有数字。
这是我的代码:
Random r = new Random();
int n = int.Parse(Console.ReadLine());
int [] a=new int[n];
for (int i = 0; i < a.Length; i++){
a[i] = r.Next(1,n);
}
有什么想法吗?
答案 0 :(得分:7)
Random r = new Random();
int n = int.Parse(Console.ReadLine());
int[] a = Enumerable.Range(1, n).OrderBy(_ => r.Next()).ToArray();
基本理念 - 创建范围内的所有数字并随机播放。
答案 1 :(得分:3)
这是你可以做到的一种方式
Random random = new Random();
int [] a = Enumerable.Range(1, 5).OrderBy(b => random.Next()).ToArray() ;
foreach (var item in a )
{
Console.Write(item + " ") ;
}
答案 2 :(得分:0)
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
Random randNum = new Random();
int[] rArray= Enumerable
.Repeat(0, n)
.Select(i => randNum.Next(1, 10)) // whatever your range is
.ToArray();
foreach (var a in rArray){
Console.WriteLine(" " + a);
}
Console.ReadLine();
}
答案 3 :(得分:0)
如果您确定要在整个套装上随机下单(即您将使用新订单的每个值),请使用Ulugbek或Ksv3n&#39;答案。供参考:
var random = new Random();
var randomOrder = Enumerable.Range(1,n).OrderBy(_ => random.Next());
但你可能只想采取前几个。那么你可以使用一个懒惰的实现,如果n很大就会更有效率,你只需要前几个,但如果你通过整个排列进行枚举则会更少。
IEnumerable<T> RandomOrder<T>(IEnumerable<T> source)
{
var remaining = source.ToList();
var random = new Random();
while (remaining.Any())
{
var index = random.Next(remaining.Length);
yield return remaining[index];
remaining.RemoveAt(index);
}
}
var randomOrder = RandomOrder(Enumerable.Range(1,n));
最佳使用方法取决于您的使用案例。通常它是前者,但并非总是如此。