Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/56: Рейтинг темы: голосов - 56, средняя оценка - 4.82
10 / 10 / 2
Регистрация: 16.08.2009
Сообщений: 418
1

Как исключить определенные числа из диапазона для функции rand()

06.03.2010, 06:35. Просмотров 11750. Ответов 8
Метки нет (Все метки)


Использую функцию rand для получения случайных значений
в диапазоне от 1 до 52

C++
1
int rcard=1+rand() % 52;
А можно как то исключить из этого диапазона скажем числа 6 и 12 ?

Это можно сделать с условием если значение rcard будет равно 6 или 12, то функция rand вызываеться еще раз, но это сильно замедляет программу, можно как то сразу задать дипазон от 1 до 52 без 6 и 12?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2010, 06:35
Ответы с готовыми решениями:

Как исключить повторение цифр в rand()
Здравствуйте! Пишу игру, есть функция isRandom, которая заполняет массив случайными числами, как...

Как исключить из копирования определенные файлы?
Привет, есть BAT-файл который с помощью команды xcopy делает бэкап из папки А в папку Б, можно ли...

Рандом: как исключить попадание в определенные значения?
Можно ли как то при получении рандомного числа функцией random.randrange(), исключить попадание в...

Найти значение функции у, заданной для целого числа х из диапазона
Найти значение функции у, заданной для целого числа х из диапазона . Функция задана четырьмя...

8
2342 / 498 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
06.03.2010, 08:35 2
C++
1
2
3
int rcard=1+rand() % 50;
if(rcard > 11)rcard++;
if(rcard > 5)rcard++;

упс!
в другом порядке.
C++
1
2
if(rcard > 5)rcard++;
if(rcard > 11)rcard++;
0
10 / 10 / 2
Регистрация: 16.08.2009
Сообщений: 418
06.03.2010, 09:21  [ТС] 3
Patch
Ну так а если rcard будет равно максимальному
и если прибавит еще единицу оно выйдет за рамки

И еще количество чисел которые надо исключить в реальной проге намного больше двух, и они задаються каждый раз разные.
0
2342 / 498 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
06.03.2010, 10:04 4
Цитата Сообщение от nill Посмотреть сообщение
Patch
Ну так а если rcard будет равно максимальному
и если прибавит еще единицу оно выйдет за рамки
обратите внимание, что я взял диапазон
C++
1
int rcard=1+rand() % 50; //50!!!

Цитата Сообщение от nill Посмотреть сообщение
И еще количество чисел которые надо исключить в реальной проге намного больше двух, и они задаються каждый раз разные.
в реальной проге делается отсортированный по возрастанию массив исключений, диапазон чисел для rand считается, как нужное максимальное минус число исключений.
дальше, после вычисления rand, тупо сканируется массив, пока значение, возвращенное rand не будет меньше числа в массиве.
и для каждого числа массива, меньшего, чем результат rand, этот результат увеличивается на 1.
проверь на листочке алгоритм.
1
10 / 10 / 2
Регистрация: 16.08.2009
Сообщений: 418
06.03.2010, 10:27  [ТС] 5
Patch,

обратите внимание, что я взял диапазон
Код C++
1
int rcard=1+rand() % 50; //50!!!
Ну так а мне же надо до 52 зачем мне диапазон до 50 ?

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

C++
1
Int massiv{2,6,32};
Диапазон для rand получаеться 52-3=49

C++
1
int rcard=1+rand() % 49;
вычислили rand хотя с чего тут должно быть число 49 когда исключаються не 50,51,52, а совсем другие числа.


тупо сканируется массив, пока значение, возвращенное rand не будет меньше числа в массиве.
и для каждого числа массива, меньшего, чем результат rand, этот результат увеличивается на 1.
Вот это даже смысл не понял чего тут делаем.
0
2342 / 498 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
06.03.2010, 10:36 6
возьми листок и посчитай.
пример с твоими тремя числами: 2,6,32
допустим, выпадает Rand = 2.
по алгоритму... получаем результат +1, т.е. число 3.
выпадает 5 - получаем 6.
выпадает 32 - получаем 35.
выпадает 49 - получаем 52.
это то, что ты и хотел получить.
0
Эксперт С++
1663 / 1035 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
06.03.2010, 10:38 7
Если диапазон допустимых чисел относительно невелик, то проще и быстрее сделать массив допустимых значений и выбирать из него значение по индексу, сгенерированному при помощи rand.
C
1
2
3
4
5
6
int Values[12] = {1, 3, 6, 7, 9, 11, 14, 16, 20};
 
int GetRandomValue()
{
    return Values[rand()%12];
}
Разумеется, прибавка в скорости достигается за счёт некоторой (впрочем, незначительной) затраты памяти.
1
2342 / 498 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
06.03.2010, 10:47 8
вот тебе функция

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//возвращает целое случайное число в диапазоне от 1 до RANDMAX
//параметры:
//1 - указатель на массив исключений
//2 - размер массива исключений
//3 - максимальная величина, возвращаемая функцией
//примечание - параметр 1 не может быть 0
int getrand(int *lpMass, int sizeMass, int RANDMAX)
{
int t = 1+rand() % (RANDMAX-sizeMass);
int c = 0;
while(c<sizeMass){
if(*(lpMass+i)>t) break;
c++;
};
return t+c;
}
1
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
06.03.2010, 11:06 9
предлагаю немного другой выход:
забиваешь в масив исключения (желательно по возростанию)
Int massiv{2,6,32};
int len=3;//длинна масива исключений
если нужно генерить число до от 1 до 52

C++
1
2
3
4
5
6
int rcard=1+rand() % 52-len;
for(int i=0;i<len-1;i++)
   {if(masiv[i]==rcard)
          rcard=52-i;
    if(massiv[i]>rcard) break;//эта строка только если массив отсортирован по возростанию
    }
теперь получается что после int rcard=1+rand() % 52-len; rcard может иметь максимальное значение 49,
но если
rcard==2 то rcard=52-0;(52)
rcard==6 то rcard=52-1;(51)
rcard==32 то rcard=52-2;(50)
все!

или вот тебе функция Patch:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//возвращает целое случайное число в диапазоне от 1 до RANDMAX
//параметры:
//1 - указатель на массив исключений
//2 - размер массива исключений
//3 - максимальная величина, возвращаемая функцией
//примечание - параметр 1 не может быть 0
int getrand(int *lpMass, int sizeMass, int RANDMAX)
{
int t = 1+rand() % (RANDMAX-sizeMass);
for(int i=0;i<sizeMass-1;i++){
   if(*lpMass[i]>t) break;//эта строка только если массив отсортирован по возростанию
   if(*lpMass[i]==t)
          t=RANDMAX-i;}
return t;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2010, 11:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как исключить число из диапазона в Random?
Есть 4 переменных: 1,2,3 и 4 - типа Integer а форме Label1 и Label2 - нужно чтобы при создании...

Как исключить определенные страницы, если в индексе include определенный файл
Здравствуйте. Такое дело. У меня включена фильтрация всех постом на сайте. Сама защита прописана в...

Как выбрать из диапазона, определенные словосочетания
Здравствуйте, уважаемые программисты. Посоветуйте с решением проблемы. В шести столбцах B5:F34...

Можно ли задать вероятность выпадения числа в функции Rand();
Вопрос в названии темы если можно как то задать вероятность то хотелось бы увидеть пример в коде!...

Исключить из массива определенные члены
Здравствуйте! Есть массив данных arrO, есть массив ненужных членов arrE. Подскажите, пожалуйста,...

Исключить определенные члены последовательности
Дана последовательность целых чисел а1,а2, ..., аn. Образо* вать новую последовательность,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.