Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
MikeB
0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 29
#1

Генерация уникальных чисел - C++

07.07.2013, 00:17. Просмотров 1327. Ответов 20
Метки нет (Все метки)

Посоветуйте способ генерации УНИКАЛЬНЫХ чисел, чтобы для бинарного дерева подошли...

Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2013, 00:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Генерация уникальных чисел (C++):

Генерация уникальных случайных чисел
Приветствую. Допустим есть диапазон от 0 до 9. Как сгенерировать число так,...

Генератор уникальных чисел c++
Подскажите, мне нужно заполнить массив 4х4 уникальными числами от 0 до 15. Но...

Подсчёт уникальных чисел в массиве
привет не мог бы ты мне не много помочь, вообщем мне нужно подсчитать кол-во...

Найти количество уникальных чисел в матрице
Найти количество уникальных чисел в 2д массиве С++ 98/03 199711 Есть готовые...

Метод поиска по массиву уникальных чисел за один проход
Подскажите какой-нибудь интересный метод поиска по массиву для данного случая:...

Децентрализованная схема генерации уникальных чисел группой узлов
Добрый день. Подскажите, пожалуйста. Есть группа узлов в сети, необходимо,...

20
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
07.07.2013, 00:28 #2
C++
1
for(int i=0; i<100; ++i)

Если чисел немного, то можно радномно генерировать и забивать в map, а потом смотреть - было оно, или нет. Большим map не должен получиться, т.к. числа генерируются равномерно на отрезке.
0
Hrobak
289 / 169 / 45
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 00:28 #3
Если от 1 до n, то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
 
const std::size_t SIZE = 20;
 
int main ()
{
    int mas [SIZE];
    for (std::size_t i=0; i<SIZE; ++i)
        mas [i] = i+1;
    std::random_shuffle (mas,mas+SIZE);
    for (std::size_t i=0; i<SIZE; ++i)
        std::cout << mas[i] << " ";
    return 0;
}
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 15:38 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <chrono>
#include <random>
#include <algorithm>
#include <iterator>
#include <unordered_set>
 
using namespace std;
 
int main ()
{
    mt19937 gen(chrono::system_clock::now().time_since_epoch().count());
    uniform_int_distribution<int> distr(0, 100000);
    const int unique_requested = 100;
    unordered_set<int> unique_values(100);
    while (unique_values.size() < unique_requested)
        unique_values.insert( distr(gen) );
    cout << unique_requested << " unique values:\n";
    copy( begin(unique_values), end(unique_values),
                ostream_iterator<int>(cout, ", "));
    return 0;
}
0
Kuzia domovenok
2212 / 1981 / 443
Регистрация: 25.03.2012
Сообщений: 6,960
Записей в блоге: 1
07.07.2013, 15:44 #5
Olivеr, не факт, что эта штука не зациклится. например, сгенерировав 99 чисел от 1 до 100, за исключением числа 42,
она будет бесконечно выполнять строчку unique_values.insert( distr(gen) ), пока функция distr(gen) не вернёт 42. А произойти это может и не очень то скоро.

Добавлено через 1 минуту
И кстати:
fatal error C1083: Cannot open include file: 'chrono': No such file or directory
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 15:46 #6
Kuzia domovenok, ну а какие еще варианты остаются?
Чтобы вероятность зацикливания была меньше нужно указывать больший диапазон

Добавлено через 58 секунд
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
fatal error C1083: Cannot open include file: 'chrono': No such file or directory
chrono появился в C++11
0
Hrobak
289 / 169 / 45
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 15:48 #7
Olivеr, а нельзя к примеру взять мой код сверху, но еще дополнительно умножить каждый элемент массива на случайное число?
0
Kuzia domovenok
2212 / 1981 / 443
Регистрация: 25.03.2012
Сообщений: 6,960
Записей в блоге: 1
07.07.2013, 15:52 #8
Цитата Сообщение от Olivеr Посмотреть сообщение
chrono появился в C++11
Это какой то новый язык? Я не так давно устонавливал MSVS2008 вроде новая студия. Всего 6 лет назад заполучил диск с ней.
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 15:52 #9
Hrobak, нет
Ваш код генерирует числа от 1 до 20 и перемешивает их.
Если умножать каждое число от 1 до 20 на случайное, то могут быть совпадения:
12*7=84
14*6=84
1
Hrobak
289 / 169 / 45
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 15:53 #10
Olivеr, да, точно, не подумал.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Это какой то новый язык?
Новый стандарт языка, 2008 студия не поддерживает
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 15:53 #11
Kuzia domovenok, это новый стандарт С++
http://ru.wikipedia.org/wiki/C%2B%2B11
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
07.07.2013, 17:18 #12
Цитата Сообщение от Olivеr Посмотреть сообщение
Если умножать каждое число от 1 до 20 на случайное, то могут быть совпадения:
12*7=84
14*6=84
А откуда вытекает необходимость умножения вообще?
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 17:50 #13
Цитата Сообщение от Tulosba Посмотреть сообщение
А откуда вытекает необходимость умножения вообще?
Цитата Сообщение от Hrobak Посмотреть сообщение
Olivеr, а нельзя к примеру взять мой код сверху, но еще дополнительно умножить каждый элемент массива на случайное число?
вот
0
Hrobak
289 / 169 / 45
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 17:53 #14
Tulosba, просто хотелось модифицировать код для случайных чисел от 1 до n для другого диапазона; я ступил и предложил умножать их на случайные.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
07.07.2013, 19:48 #15
Цитата Сообщение от Hrobak Посмотреть сообщение
просто хотелось модифицировать код для случайных чисел от 1 до n для другого диапазона
так надо просто константы поменять и всё.
0
Hrobak
289 / 169 / 45
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 20:00 #16
Tulosba, не до конца понимаю как, можете привести пример?
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
07.07.2013, 20:24 #17
Hrobak, ну если мы говорим про модификацию Вашего кода, то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <algorithm>
 
const int min = -5;
const int max = +5;
const std::size_t SIZE = max-min;
 
int main ()
{
    int mas [SIZE];
    for (std::size_t i=0; i<SIZE; ++i)
        mas [i] = i+1+min;
    std::random_shuffle (mas,mas+SIZE);
    for (std::size_t i=0; i<SIZE; ++i)
        std::cout << mas[i] << " ";
    return 0;
}
0
Hrobak
289 / 169 / 45
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 20:33 #18
Tulosba, но ведь так у нас просто от -4 до 5 числа. Я имел в виду домножать, чтобы перейти к примеру к диапазону от 1 до 10000, как бы расширить его.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
07.07.2013, 21:34 #19
Hrobak, может я не так понял. Надо из диапазона 1...M выбрать N (N<=M) уникальных чисел или что?
0
Hrobak
289 / 169 / 45
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 23:44 #20
Tulosba, изначально выбирается 20 чисел из диапазона 1..20. С этим проблем нет, мы просто записываем в массив 20 элементов последовательно и применяем std::random_shuffle. А я хотел, чтобы с помощью того же массива и std::random_shuffle генерить числа из бОльшего диапазона, например 1..10000.
0
07.07.2013, 23:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2013, 23:44
Привет! Вот еще темы с решениями:

Отсортировать массив и подсчитать количество уникальных чисел в массиве
Что не так????????????? #include &lt;clx.h&gt; #pragma hdrstop #include &lt;clx.h&gt;...

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

Генерация чисел
Вообщем мне нужно сгенерировать отрицательное вещественное число с 2 цифрами...

Генерация чисел
Помогите написать программу, а мучусь уже два часа. :) Нужно сгенерировать 30...


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

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

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