Цикл While в C, который генерирует случайные числа, работающие до бесконечности

#arrays #c #random #while-loop #random-seed

Вопрос:

Я хочу создать программу, которая генерирует 2 случайные координаты, а затем проверяет, является ли место в 2D-массиве, которое я создал ранее, пустым (значение в массиве равно 0). Если true, он помещает значение 2 в эти координаты, иначе он должен продолжать искать такое место. Проблема в том, что в некоторых случаях он работает на бесконечность.

Вот массив, который я создал:

 int array[4][4] =
{
    {0,0,0,0},
    {0,0,0,0},
    {0,0,0,0},
    {0,0,0,0}
};
 

Вот остальная часть кода:

 srand(time(NULL));
int ranadom_num[2] = { rand() % 4, rand() % 4 };
while (array[ranadom_num[0]][ranadom_num[1]] != 0)
{
    int ranadom_num[2] = { rand() % 4, rand() % 4 };
}
array[ranadom_num[0]][ranadom_num[1]] = 2;
 

Любая помощь? 🙂

Комментарии:

1. random_num Определенные вне цикла и внутри цикла — это два разных объекта. Фактически тот, который находится в цикле, является другим объектом на каждой итерации.

2. Как указано @EugeneSh. once random_num , либо это будет бесконечный цикл, либо без цикла. здесь вы можете увидеть рабочий код

3. @TruthSeeker почему бы не опубликовать в качестве ответа?

Ответ №1:

Вы повторно объявляете ranadom_num в цикле и не устанавливаете значение в массиве до тех пор, пока цикл не завершится, вот почему вы получаете бесконечный цикл.

 srand(time(NULL));
int ranadom_num[2] = { rand() % 4, rand() % 4 };
while (array[ranadom_num[0]][ranadom_num[1]] != 0)
{
    //now there's a chance that the array will have a 2 in it
    array[ranadom_num[0]][ranadom_num[1]] = 2; 
    ranadom_num[0] = rand() % 4;
    ranadom_num[1] = rand() % 4;
}
 

Ответ №2:

В данном фрагменте кода есть две переменные,

 int ranadom_num[2] = { rand() % 4, rand() % 4 }; //here 1

while (array[ranadom_num[0]][ranadom_num[1]] != 0)
{
    int ranadom_num[2] = { rand() % 4, rand() % 4 }; //here 2
}
 

таким образом, random_num выбранный at 1 не изменяется внутри цикла, а random_num at 2 бесполезен, поскольку он не используется в данной области (т.Е. Внутри цикла).

Обновленный код можно найти здесь,

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>

int
main ()
{
  int array[4][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12},
    {0, 0, 0, 0}
  };

  srand (time (NULL));
  int ranadom_num[2] = { rand () % 4, rand () % 4 };
  while (array[ranadom_num[0]][ranadom_num[1]] != 0)
    {
      printf ("%d ", array[ranadom_num[0]][ranadom_num[1]]);
      ranadom_num[0] = rand () % 4;
      ranadom_num[1] = rand () % 4;
    }
  array[ranadom_num[0]][ranadom_num[1]] = 2;

  return 0;
}
 

Вам также нужно позаботиться о значениях внутри array . По крайней мере, один элемент должен быть zero для завершения цикла, иначе это будет бесконечный цикл.