如何生成不重复的唯一随机整数

时间:2015-10-14 05:07:37

标签: c# arrays random

我创建了一个简短的程序,在1-9之间创建3个随机整数并将它们存储在一个数组中,但是,我不希望它们中的任何一个重复,也就是说,我希望每个都是唯一的。除了必须遍历数组并将每个整数相互比较之外,是否有更简单的方法来生成3个唯一的整数?如果我将数组增加到超过3个整数,那似乎太乏味了。 这是我生成3个随机数的代码。我在Java中看到了其他代码,但我认为C#可能更容易,更有效。

var number = new Numbers[3];
Random r = new Random();
for ( int i = 0; i < number.Length; i++)
{
     number[i] = new Numbers(r.Next(1,9));
}
Console.WriteLine("The Three Random Numbers Are:");
foreach(Numbers num in number)
{
    Console.WriteLine("{0}", num.Number);
}

3 个答案:

答案 0 :(得分:1)

我会做这样的事情:

var range = Enumerable.Range(1, 8);

var rnd = new Random();
var listInts = range.OrderBy(i => rnd.Next()).Take(3).ToList();

答案 1 :(得分:0)

您可以创建一个数组或可能生成的数字列表,例如0,1,2,3。然后,您生成一个从0到此列表长度的数字,例如2和选择列表[2]所以下次你的列表中只有0,1,3。 生成它需要更长的时间,特别是对于长列表,但它不会重复数字。

答案 2 :(得分:0)

using System;
using System.Collections.Generic;

public class Test
{
    static Random random = new Random();

    public static List<int> GenerateRandom(int count)
    {
        // generate count random values.
        HashSet<int> candidates = new HashSet<int>();
        // top will overflow to Int32.MinValue at the end of the loop
        for (Int32 top = Int32.MaxValue - count + 1; top > 0; top++)
        {
            // May strike a duplicate.
            if (!candidates.Add(random.Next(top))) {
                candidates.Add(top);
            }
        }

        // load them in to a list.
        List<int> result = new List<int>();
        result.AddRange(candidates);

        // shuffle the results:
        int i = result.Count;  
        while (i > 1)
        {  
            i--;  
            int k = random.Next(i + 1);  
            int value = result[k];  
            result[k] = result[i];  
            result[i] = value;  
        }  
        return result;
    }
    public static void Main()
    {
        List<int> vals = GenerateRandom(10);
        Console.WriteLine("Result: " + vals.Count);
        vals.ForEach(Console.WriteLine);
    }
}

here

获得解释和答案

来源http://ideone.com/Zjpzdh