如何使用for循环和if语句用唯一的随机数填充数组?

时间:2019-01-22 02:15:41

标签: c# arrays for-loop if-statement random

我正在尝试用随机的BUT唯一数字填充一维数组(没有一个数字应该相同)。我猜我在第二个for循环中有一个逻辑错误,但无法正确解决。

P.S我不是在寻找一个更“复杂”的解决方案-我现在所知道的只是for.if。 P.P.S我知道这确实是一个初学者的问题,对此感到抱歉。

        int[] x = new int[10];

        for (int i = 0; i < x.Length; i++)
        {
            x[i] = r.Next(9);

            for (int j = 0; j <i; j++)
            {
                if (x[i] == x[j]) break;

            }
        }
        for (int i = 0; i < x.Length; i++)
        {
            Console.WriteLine(x[i);
        }

4 个答案:

答案 0 :(得分:0)

这是您的代码的解决方案。

    int[] x = new int[10];

    for (int i = 0; i < x.Length;)
    {
        bool stop = false;
        x[i] = r.Next(9);

        for (int j = 0; j <i; j++)
        {
            if (x[i] == x[j]) {
                stop = true;
                break;
            }
        }
        if (!stop)
           i++;
    }
    for (int i = 0; i < x.Length; i++)
    {
        Console.WriteLine(x[i]);
    }

答案 1 :(得分:0)

对发布的代码进行简单的跟踪即可发现其中的一些问题。具体来说,就行了……

if (x[i] == x[j]) break;

如果随机数在数组中“已经”,那么简单地退出j循环就可以将当前的i值跳过到x数组中。这意味着只要找到重复项,x [i]的默认值就会为0(零),然后被跳过。

外部i循环显然在x int数组中循环,这很清楚并且看起来还不错。但是,第二个内部循环实际上并不能是for循环……这就是为什么……基本上,您需要找到一个随机的int,然后遍历现有的ints来看看它是否已经存在。鉴于此,从理论上讲,您可以在获得唯一的随机数之前多次捕获相同的随机数。因此,在这种情况下……您真的不知道在找到此唯一编号之前,您会循环多少次。

话虽如此,这可能有助于“分解”您的问题。我猜想,与int数组中现有的ints相比,返回“唯一” x的“方法”可能会派上用场。创建一个无尽的while循环,在该循环内,我们将获取一个随机数,然后循环遍历“现有” ints。如果随机数不是重复数,那么我们可以简单地返回该值。这是该方法的全部工作,可能类似于以下内容。

private static int GetNextInt(Random r, int[] x, int numberOfRandsFound) {
  int currentRand;
  bool itemAlreadyExist = false;
  while (true) {
    currentRand = r.Next(RandomNumberSize);
    itemAlreadyExist = false;
    for (int i = 0; i < numberOfRandsFound; i++) {
      if (x[i] == currentRand) {
        itemAlreadyExist = true;
        break;
      }
    }
    if (!itemAlreadyExist) {
      return currentRand;
    }
  }
}

注意:现在是时候在这段代码中描述可能的无限循环……

当前,随机数和数组的大小是相同的,但是,如果数组的大小“大于”随机数分布的范围,则上面的代码将永远不会退出。例如,如果当前x数组的大小设置为11,而随机数保留为10,则将永远无法设置x[10]项,因为已经使用了所有可能的随机数。我希望这是有道理的。

一旦有了上述方法,其余的就应该很简单。

static int DataSize;
static int RandomNumberSize;

static void Main(string[] args) {
  Random random = new Random();
  DataSize = 10;
  RandomNumberSize = 10;
  int numberOfRandsFound = 0;
  int[] ArrayOfInts = new int[DataSize];
  int currentRand;
  for (int i = 0; i < ArrayOfInts.Length; i++) {
    currentRand = GetNextInt(random, ArrayOfInts, numberOfRandsFound);
    ArrayOfInts[i] = currentRand;
    numberOfRandsFound++;
  }
  for (int i = 0; i < ArrayOfInts.Length; i++) {
    Console.WriteLine(ArrayOfInts[i]);
  }
  Console.ReadKey();
}          

最后,正如其他人所提到的,使用List<int>

static int DataSize;
static int RandomNumberSize;

static void Main(string[] args) {
  Random random = new Random();
  DataSize = 10;
  RandomNumberSize = 10;
  List<int> listOfInts = new List<int>();
  bool stillWorking = true;
  int currentRand;
  while (stillWorking) {
    currentRand = random.Next(RandomNumberSize);
    if (!listOfInts.Contains(currentRand)) {
      listOfInts.Add(currentRand);
      if (listOfInts.Count == DataSize)
        stillWorking = false;
    }
  }
  for (int i = 0; i < listOfInts.Count; i++) {
    Console.WriteLine(i + " - " + listOfInts[i]);
  }
  Console.ReadKey();
}

希望这会有所帮助;-)

答案 2 :(得分:-1)

典型的解决方案是按顺序生成整个电势集 (在这种情况下,该数组的值为0到9)。然后随机播放序列

private static Random rng = new Random();  

public static void Shuffle(int[] items)  
{  
    int n = list.Length;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        int temp = items[k];  
        items[k] = items[n];  
        items[n] = temp;  
    }  
}

static void Main(string[] args)
{
    int[] x = new int[10];
    for(int i = 0; i<x.Length; i++)
    {
        x[i] = i;
    }

    Shuffle(x);

    for(int i = 0; i < x.Length; i++)
    {
        Console.WritLine(x[i]);
    }
} 

//alternate version of Main()
static void Main(string[] args)
{
    var x = Enumerable.Range(0,10).ToArray();
    Shuffle(x);
    Console.WriteLine(String.Join("\n", x));  
} 

答案 3 :(得分:-1)

您可以简单地执行以下操作:

addView()