С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Faltfromoss
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 32
#1

Генератор случайных чисел - C++

29.06.2014, 14:10. Просмотров 1713. Ответов 16
Метки нет (Все метки)

Еще одна тема о генераторе. Только вопрос, на который я пока не нашел ответа в других темах. Как сгенерировать случайное число в двух или более разных заданных диапазонах? Т. е. если мы стандартно описываем генерацию в диапазоне от m до n:
C++
1
rand() % (n+1-m) + m
то здесь всё ясно. Но мне нужно сгенерировать например число, которое будет входить в один из диапазанов, например от 1 до 10 или от 23 до 72 или от 123 до 140 и т. д. и т. п. Я пока похожих примеров не нашел. Либо оно никому не нужно кроме меня, либо решение на столько простое, что никто этим вопросом не задавался кроме меня. Либо хреново искал, тоже как вариант.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2014, 14:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Генератор случайных чисел (C++):

Генератор случайных чисел - C++
Есть функция, генерирующая случайные целые числа с помощью линейного конгруэнтного метода. Нужно сделать частотный побитовый тест для...

Генератор случайных чисел - C++
Здравствуйте, для программы мне требуется генератор, который будет задавать рандомно число, но данное число должно быть с определенными...

Генератор случайных чисел - C++
Реализовать генератор случайных числе в диапазоне от нуля до единицы. После генерации случайного числа, записывать 0 или 1 (в соответствии...

Генератор случайных чисел - C++
Как написать генератор случайных (пусть и псевдо) чисел, выдающий на выходе целые случайные числа от 1 до 10 и в кол-ве 10-и и без...

Генератор случайных чисел - C++
Добрый день!У меня есть код #include <iostream> #include <cstdlib> #include <cstring> #include <ctime> char randSym() { ...

Генератор случайных чисел - C++
Еще ни разу не использовал rand(), знаю что перед ним нужно srand(time(NULL)), потому как без этого числа будут одинаковы постоянно. Но не...

16
Убежденный
Ушел с форума
Эксперт С++
15708 / 7219 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
29.06.2014, 14:15 #2
Сгенерировать один rand и использовать его как диапазон для второго rand.
0
Kerry_Jr
Модератор
Эксперт PHP
2206 / 2002 / 701
Регистрация: 14.05.2014
Сообщений: 5,867
Записей в блоге: 1
Завершенные тесты: 5
29.06.2014, 14:17 #3
От m до n
C++
1
rand() % (n - m + 1) + m
А в чем проблема-то?
0
Vladimir.
158 / 158 / 10
Регистрация: 24.11.2009
Сообщений: 375
29.06.2014, 14:23 #4
Цитата Сообщение от Faltfromoss Посмотреть сообщение
либо решение на столько простое..
C++
1
2
3
4
5
std::random_device rd;
std::uniform_int_distribution<int> spread1 (23,72); // между 23 и 72
std::uniform_int_distribution<int> spread2 (123,140); // между 123 и 140
int rdnum1 = spread1(rd);
int rdnum2 = spread2(rd)
0
Faltfromoss
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 32
29.06.2014, 14:24  [ТС] #5
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
А в чем проблема-то?
Проблема в том, что в этот код я могу подставить границы одного, диапазона, например m=5, n=15 и rand() будет возвращать числа от 5 до 15 и всё. А мне нужно, к примеру, чтобы помимо этого диапазона от 5 до 15-ти он возвращал числа еще из другого диапазона, к примеру от 23 до 42 тоже случайным образом

Цитата Сообщение от Убежденный Посмотреть сообщение
Сгенерировать один rand и использовать его как диапазон для второго rand.
Немного не понял ход мысли. :\
0
SlavaSSU
216 / 161 / 45
Регистрация: 17.07.2012
Сообщений: 587
29.06.2014, 14:26 #6
Faltfromoss, как варик, сгенерить первый ранд из 1 диапазона, сгенерить 2 ранд из 2 диапазона, а потом рандомно выбать один из них xD
0
Faltfromoss
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 32
29.06.2014, 14:28  [ТС] #7
Цитата Сообщение от SlavaSSU Посмотреть сообщение
Faltfromoss, как варик, сгенерить первый ранд из 1 диапазона, сгенерить 2 ранд из 2 диапазона, а потом рандомно выбать один из них xD
Я сейчас больше к этому варианту и склоняюсь, других пока не вижу.
0
astronomydomine
0 / 0 / 0
Регистрация: 17.09.2013
Сообщений: 3
29.06.2014, 14:29 #8
Есть вариант написать цикл, в котором программа генерирует число в диапазоне от минимального до максимального числа из данных диапазонов и каждый раз проверяет, если оно не входит в один из диапазонов, то снова генерирует до тех пор, пока не появится нужное число. Просто это много времени займет.
0
Kerry_Jr
Модератор
Эксперт PHP
2206 / 2002 / 701
Регистрация: 14.05.2014
Сообщений: 5,867
Записей в блоге: 1
Завершенные тесты: 5
29.06.2014, 14:37 #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <ctime>
#include <cstdlib>
 
int main()
{
    setlocale(LC_ALL, "");
    int n;
    srand(unsigned(time(NULL)));
    // Предположим, имеется три диапазона,
    // в один из которых должно входить число
    // берем минимальное и максимальное из всех диапазонов
    // и находим случайное, затем проверяем, входит ли оно
    // в один из диапазонов, если да - возвращаем, нет - проделываем это снова
    // Диапазоны 1-10, 23-79, 110-140
    while (true)
    {
        n = rand() % (140 -1 + 1) + 1;
        if ((n > 0 && n < 11) || (n > 22 && n < 80) || (n > 109 && n < 141)) break;
    }
    std::cout << n << std::endl;
    return 0;
}
Долго работает

Добавлено через 55 секунд
astronomydomine, такая же идея пришла в голову
1
Faltfromoss
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 32
29.06.2014, 14:40  [ТС] #10
Kerry_Jr, согласен, как вариант тоже вполне применимый.
0
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
29.06.2014, 14:42 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
astronomydomine, Kerry_Jr, жесть какая... Надеюсь, сами понимаете, что такие решения неприемлемы.

Добавлено через 2 минуты
Faltfromoss,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <map>
#include <vector>
 
int main() {
    std::vector<std::pair<int, int>> ranges {
        {0, 10},
        {20, 25},
        {50, 60}
    };
    
    std::map<int, int> counters;
    
    for (int i = 0; i < 100000; ++i) {
        const int range_index = rand() % ranges.size();
        const auto& range = ranges[range_index];
        const int number = rand() % (range.second - range.first + 1) + range.first;
        ++counters[number];
    }
    
    for (const auto& item : counters) {
        std::cout << item.first << ": " << item.second << std::endl;
    }
    
    return 0;
}
http://ideone.com/3zvfgI
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,248
29.06.2014, 14:45 #12
хоть сто диапазонов
вот с таким подходом
C++
1
2
3
4
5
6
7
8
9
10
11
int m=rand()%2;
switch(m)
{
  case 0:
    n=rand()%(k0+1-p0)+p0;
    break;
  case 1:
    n=rand()%(k1+1-p1)+p1;
    break;
 
}
1
Убежденный
Ушел с форума
Эксперт С++
15708 / 7219 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
29.06.2014, 14:47 #13
Цитата Сообщение от Faltfromoss Посмотреть сообщение
Немного не понял ход мысли. :\
Пусть есть N диапазонов, у каждого свои min- и max-значения.
Генерируем первое случайное число от 1 до N - это будет номер диапазона.
А затем второе случайное число от min до max внутри выбранного диапазона.

0x10 расписал уже все выше, добавить нечего.
0
zss
Модератор
Эксперт С++
6580 / 6142 / 2024
Регистрация: 18.12.2011
Сообщений: 16,010
Завершенные тесты: 1
29.06.2014, 14:50 #14
Тогда еще вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
// Предположим, имеется три диапазона,
    // в один из которых должно входить число
    // берем сумму интервалов всех диапазонов
    // и находим случайное, затем проверяем, переходит ли оно границу,
    // если да - прибавляем пропускаемый интервал
    // Диапазоны 1-10, 23-79, 110-140
    // сумма интервалов 9+56+30=95
    n = rand() %95+1;
    if(n>10)
         n+=13;
    if(n>79)
         n+=31;
0
Vladimir.
158 / 158 / 10
Регистрация: 24.11.2009
Сообщений: 375
29.06.2014, 14:50 #15
как варик, сгенерить первый ранд из 1 диапазона, сгенерить 2 ранд из 2 диапазона, а потом рандомно выбать один из них
Есть вариант написать цикл, в котором программа генерирует число в диапазоне от минимального до максимального числа из данных диапазонов и каждый раз проверяет...
работать оно конечно будет, но нехорошо так делать совсем(с)

пишем функцию вычисления длинны диапазона, находим суммарную длину всех диапазонов, бросаем кость по суммарной длине, вычисляем в какой диапазон и элемент попали. Такой способ будет работать во первых быстро, во вторых не будет нарушать тип распределения.
1
29.06.2014, 14:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2014, 14:50
Привет! Вот еще темы с ответами:

Генератор случайных чисел - C++
В общем, нужно составить программу, которая реализует алгоритм генерации случайных чисел. Естественно не используя random. Перерыла массу...

Генератор случайных чисел - C++
Здравствуйте, написал вот такой генератор псевдослучайных чисел в диапазоне 0-99 и задался вопросом о его скорости. Я считываю время...

Генератор случайных чисел - C++
Вот написал программу, которая генерирует матрицу 9*9. В каждой строке - от 1 до 9, не повторяются В каждом стобце - то же самое. ...

Генератор случайных чисел - C++
Пишу курсовую по криптографии, для генерации ключей, естественно, нужен генератор случайных чисел. Что вообще можно использовать в этом...


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

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

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