特定范围内的随机数C#

时间:2015-04-13 09:27:57

标签: c#

我需要以随机顺序打印1n的数字。我通过使用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);
}

有什么想法吗?

4 个答案:

答案 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));

最佳使用方法取决于您的使用案例。通常它是前者,但并非总是如此。