Что вы можете сделать, если вы не возражаете получить один и тот же номер более одного раза (если его нет в строке), но вам не нужен внутренний цикл, который пытается получить новый номер, это:
Получить случайное число от 1 до 100 обычно в первом цикле.
После этого, добавив случайное число от 3 до 97 к последнему числу, а затем используя модуль 100, вы получите случайное число в диапазоне от 1 до 100, исключая числа в диапазоне от oldNum - 2
до * 1010. *.
(Обратите внимание, что это оборачивает диапазон исключенных номеров, так что, например, если последнее число было 100, то 1 и 2 также будут исключены).
srand(time(NULL));
int randomNumber;
for(i = 0; i < 100; i++) {
if (i == 0) {
randomNumber = (rand() % 100) + 1; // gets a random number from 1 - 100.
} else {
randomNumber = ((randomNumber + (rand() % 95) + 3) % 100) + 1;
}
// do stuff
}
Если вы не хотите, чтобы список исключенных номеров был перенесен (например, если последний номер был 99, то вы бы хотели исключить только 97, 98, 99 и 100), тогда это немного сложнее:
Вы все еще хотите получить случайное число от 1 до 100 обычно в первом цикле.
После этого по умолчанию будет добавлено случайное число от 3 до 97 к последнему числу, а затем по модулю 100 вы получите случайное число в диапазоне от 1 до 100, исключая числа в диапазоне oldNum - 2
до oldNum + 2
.
Но прежде чем перейти к настройкам по умолчанию, вам нужно проверить, является ли старое число настолько низким или настолько высоким, что диапазон исключенных чисел будет охватывать:
а. Если старое число настолько мало, что диапазон исключенных чисел будет перенесен, нам нужно случайное число в диапазоне от oldNum + 3
до 100.
б. Если старое число настолько велико, что диапазон исключенных чисел будет перенесен, нам нужно случайное число в диапазоне от 1 до oldNum - 3
.
srand(time(NULL));
int randomNumber;
for(i = 0; i < 100; i++) {
if (i == 0) {
randomNumber = (rand() % 100) + 1; // gets a random number from 1 - 100.
} else {
if (randomNumber < 3) {
/* Old number is so low that excluded numbers would wrap if we would
* be using the 'default' way.
* We want a random number in the range from randomNumber + 3 to 100:
*/
randomNumber += (rand() % (98 - randomNumber)) + 3;
}
else if (randomNumber > 98) {
/* Old number is so high that excluded numbers would wrap if we would
* be using the 'default' way.
* We want a random number in the range from 1 to randomNumber - 3:
*/
randomNumber = (rand() % (randomNumber - 3)) + 1;
} else {
/* Default way.
* We want a random number in the range 1 to 100, excluding numbers in the
* range randomNumber - 2 to randomNumber + 2
*/
randomNumber = ((randomNumber + (rand() % 95) + 3) % 100) + 1;
}
}
// do stuff
}
Если у кого-то есть такая же проблема, но он хочет, чтобы число в другом диапазоне и / или хотело, чтобы диапазон исключаемых чисел был другим, вот тот же код, но с константами вместо «магических чисел»:
srand(time(NULL));
int randomNumber;
int const maxNum = 100; // Random number must be in the range from 1 to maxNum
int const exclude = 2; // New random number must NOT be in the range
// from (oldNum - exclude) to (oldNum + exclude)
for(i = 0; i < 100; i++) {
if (i == 0) {
randomNumber = (rand() % maxNum) + 1; // gets a random number from 1 to maxNum.
} else {
if (randomNumber <= exclude) {
/* Old number is so low that excluded numbers would wrap if we would
* be using the 'default' way.
* We want a random number in the range from (randomNumber + exclude + 1)
* to maxNum:
*/
randomNumber += (rand() % (maxNum - exclude - randomNumber)) + exclude + 1;
}
else if (randomNumber > maxNum - exclude) {
/* Old number is so high that excluded numbers would wrap if we would
* be using the 'default' way.
* We want a random number in the range from 1 to (randomNumber - exclude - 1):
*/
randomNumber = (rand() % (randomNumber - exclude - 1)) + 1;
} else {
/* Default way.
* We want a random number in the range 1 to 100, excluding numbers in the
* range randomNumber - exclude to randomNumber + exclude
*/
randomNumber = ((randomNumber + (rand() % (maxNum - 2*exclude - 1)
+ exclude + 1) % maxNum) + 1;
}
}
// do stuff
}