Запустите цикл со случайным значением, затем повторите весь диапазон

#c #loops #for-loop

#c #циклы #для цикла

Вопрос:

Сначала: я генерирую случайное значение в диапазоне от 0 до 30 , например.

Второй: выберите 18 из диапазона.

Третье: необходимо выполнять цикл от 18 - 30 и из 17 - 0 в одном цикле.

Необязательно: диапазон может быть изменен, это был пример. Главное, что мне нужно выполнить цикл в одном цикле, начиная с сгенерированного числа в диапазоне. И не важно, в каком порядке я могу начать цикл. Дело в том, что я должен начать цикл со случайного числа из диапазона.

Я пробовал только с двумя циклами, такими как этот:

 int low;
int high;
/* Generate a random value from low to high*/

for (i =  middleRand  ; i < high; i  )
{ 
       /* TODO*/
}
for ( i = middleRand - 1; i > low; i--)
{
      /* TODO*/
}
  

Но это не то, что мне действительно нужно, и я хотел бы использовать только один цикл.

Пример:

У меня есть две точки, которые создаются параллельно. Первая точка начинает свой цикл с 0 - 29 , другая 0 - 29 . Но моя цель состоит в том, чтобы первая точка начиналась со случайного числа из диапазона ( 18 ), вторая — под 11 . Но для всех двух точек необходимо выполнить цикл всего диапазона.

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

1. from 18 - 30 and from 17 - 0 — это не цикл. Сначала исправьте это. Затем попробуйте сделать это с 1 циклом for для диапазона [0; n) . Вам придется использовать ... % n . Затем обобщите это для всех диапазонов.

2. Есть ли веская причина для наличия одного цикла? Звучит как xyproblem.info

3. @MayurK, звучит как HW.

4. @dyukha Нет, это не HW. Вам нужно прочитать конкретные вещи, почему я задаю вопрос? Я попытался задать простой вопрос, если я смогу получить какой-то ответ, я возьмусь за решение проблемы. Спасибо за вашу помощь. Я подумаю о вашем предложении вверху.

5. Итак, можете ли вы уточнить, вам нужно циклировать (так что это 18->30 тогда 0->17 ) или вам нужно 18->30 тогда 17->0 ? В последнем случае мой комментарий неприменим, и вам также следует удалить слово » цикл » из проблемы.

Ответ №1:

Ваш вопрос не совсем ясен. Но я могу сказать, что если я понимаю ваш вопрос, то вы можете сделать:

 int low;
int high;
int random_val = rand() % (high -low)   low;

for (int i = 0; i < high; i  ) {
    if (i > random_val) {
         // low
    } else {
         // high
    }
}
  

вы можете заменить //low кодом для цикла low и //high для цикла high

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

1. Согласно вопросу, переход от среднего к низкому должен происходить в уменьшенном порядке. Но, как вы упомянули, вопрос неясен:(

2. @Hamza Ince Мне нужен тот же код по low и high частям, но запустите цикл со случайным значением.

3. Я изменил свой код, теперь случайное значение находится между высоким и низким, и в цикле я проверяю, больше ли i, чем случайное значение

4. @JustMe Если проблема заключается в попытке минимизировать строки кода путем объединения двух циклов в один, вам следует вместо этого рассмотреть использование функций. (Ваш вопрос кажется проблемой xy . Совершенно невозможно / сложно объединить эти два цикла в один последовательно.)

5. ну, это определенно возможно, но нужно было бы изменить i на что-то вроде i =k и k , являющееся значением, которое будет либо 1 или -1 , в зависимости от текущего тела цикла. Это очень классическое школьное упражнение / домашнее задание.

Ответ №2:

Вот простое решение:

 int low = 0;                      // start of range, included
int high = 30;                    // end of range, included
int span = high - low   1;        // number of values in the range
int start = low   rand() % span;  // random initial value
for (int i = 0; i < span; i  ) {  // generate `span` values
    int value = low   (i   start - low) % span;
    // use value for this iteration
}
  

Ответ №3:

Если я понял, то, что вы пытаетесь сделать, это управлять несколькими управляющими переменными цикла одновременно. Для этого есть идиома C:

 int i, j, k;
for (i = 18, j = 17, k = 1; i < 30; i  , j--, k <<= 1) {
     /* bla bla */
}
  

В этом случае i будет 18, 19, ...., 29 , j будет 17, 16, ..., 7 и k будет 1, 2, 4, 8, ... .

Есть одна вещь, которую вы не можете сделать при таком подходе… заключается в том, чтобы иметь разные способы завершения цикла, в зависимости от разных управляющих переменных. В вашем случае вы говорите, что первая переменная переходит от 18 к 30 , что составляет 12 проходов через цикл, в то время как вторая переходит от 17 к 0 , что составляет 18 проходов через цикл, вам нужно решить, когда остановиться, потому что сейчас есть только цикл.