独特的随机化方法 - C#

时间:2017-04-06 08:53:27

标签: c# arrays loops random methods

基本上我创建了一个随机化数字然后返回0或随机值的方法。 (取决于数组是否已将该值存储在其中)。目前有2个问题。并非所有路径都返回值。我的循环(i ++)的最后一部分是无法访问的。任何帮助都会很棒。 还有我为随机发生器创建的数组:

int[] arr = new int[4];

继承人的方法:

public int UniqueRandomiser()        
{
    Random rnd = new Random();

       int j = rnd.Next(1, 4);
        for (int i = 0; i < 4; i++)
        {
            if (rand1[i] == j)
            {
                return 0;
            }
            else
            {
                return j;
            }

        }   
}

4 个答案:

答案 0 :(得分:1)

我建议使用 Linq 并使代码可读

// Do not recreate Random (or you're going to have badly skewed values); 
// the simplest, but not thread safe
private static Random rnd = new Random();

public int UniqueRandomiser() {
  //TODO: what does 4 stand for? Get rid of magic numbers...
  int v = rnd.Next(1, 4);

  //TODO: another magic number 4; is it connected with the previous one?
  // if any of first 4 items of rand1 is equal to v return 0
  return rand1.Take(4).Any(item => item == v) ? 0 : v;  
}

答案 1 :(得分:1)

您可以在阵列上使用.Contains来检查号码是否存在:

return randomArray.Contains(randomNumber) ? 0 : randomNumber;

编辑:如果我们要求只检查前4个数字:

return randomArray.Take(4).Contains(randomNumber) ? 0 : randomNumber;

答案 2 :(得分:0)

&#34;无法到达&#34;对于i++,因为第一次通过循环,它return在每个代码路径上 - 所以i++确实永远不会到达。另一个错误是因为一个假设的(但实际上是不可能的)代码路径,它不会返回一个值 - 如果循环运行完成(它不能返回)而不返回一个值,然后该方法没有返回值。

我希望你的意思是:

public int UniqueRandomiser()        
{
    Random rnd = new Random();

    int j = rnd.Next(1, 4);
    for (int i = 0; i < 4; i++)
    {
        if (rand1[i] == j)
        {
            return 0;
        }
    }   
    return j;
}

然而......这仍然是一种非常糟糕的方式......不管你是不是想做什么。

答案 3 :(得分:0)

我认为这就是你所需要的。

public int UniqueRandomiser()        
{
    Random rnd = new Random();

    int j = rnd.Next(1, 4);

    for (int i = 0; i < 4; i++)
    {
        if (rand1[i] == j)
        {
            return 0;
        }
    }
    return j;
}

但它确实没有意义。如果返回的号码必须是唯一的,那么它不是真正的随机数。