#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 проходов через цикл, вам нужно решить, когда остановиться, потому что сейчас есть только цикл.