如何检查随机值是否唯一?

时间:2015-01-26 14:16:01

标签: c# arrays random numbers

C#代码:

我在数组中的1-100之间有20个随机数,程序应检查每个值是否唯一。现在我应该使用另一个方法,如果数组中只有唯一值,则返回true;如果数组中没有任何唯一值,则返回false。如果有人能帮助我,我将不胜感激。

3 个答案:

答案 0 :(得分:8)

bool allUnique = array.Distinct().Count() == array.Count(); // or array.Length

var uniqueNumbers = new HashSet<int>(array);
bool allUnique = uniqueNumbers.Count == array.Count();

答案 1 :(得分:5)

@TimSchmelters的一个小替代品,可以提高效率:

public static bool AllUniq<T> (this IEnumerable<T> data) {
    HashSet<T> hs = new HashSet<T>();
    return data.All(hs.Add);
}

这基本上是生成for循环:

public static bool AllUniq<T> (this IEnumerable<T> data) {
    HashSet<T> hs = new HashSet<T>();
    foreach(T x in data) {
        if(!hs.Add(x)) {
            return false;
        }
    }
    return true;
}

hs.Add失败的那一刻起 - 因为该元素已经存在 - 该方法返回false,如果找不到这样的对象,则返回true

这可以更快地工作的原因是它将从找到重复的那一刻起停止该过程,而先前讨论的方法首先构造唯一数字的集合然后比较大小。现在,如果迭代大量数字,构建整个不同列表可能是计算密集型的。

此外请注意,除了生成并测试generate random distinct numbers之外,还有更聪明的方法。例如,交错生成测试过程。一旦一个项目我必须以这种方式纠正生成的数独。结果是,在得到一个谜题之前,必须等待整整一天。

答案 2 :(得分:1)

这是一个非linq解决方案

  for(int i=0; i< YourArray.Length;i++)
  {
    for(int x=i+1;  x< YourArray.Length; x++)
    {
      if(YourArray[i] == YourArray[x])
        {
            Console.WriteLine("Found repeated value");
        }
    }   
  }