Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2013, 00:17     Генерация уникальных чисел
Посмотрите здесь:

Генерация чисел C++
Генерация чисел C++
Генерация чисел Хэмминга C++
генерация чисел C++
Генерация чисел C++
C++ Генерация простых чисел
C++ генерация чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1264 / 622 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
07.07.2013, 00:28     Генерация уникальных чисел #2
C++
1
for(int i=0; i<100; ++i)

Если чисел немного, то можно радномно генерировать и забивать в map, а потом смотреть - было оно, или нет. Большим map не должен получиться, т.к. числа генерируются равномерно на отрезке.
Hrobak
288 / 168 / 11
Регистрация: 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;
}
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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;
}
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 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
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 15:48     Генерация уникальных чисел #7
Olivеr, а нельзя к примеру взять мой код сверху, но еще дополнительно умножить каждый элемент массива на случайное число?
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
07.07.2013, 15:52     Генерация уникальных чисел #8
Цитата Сообщение от Olivеr Посмотреть сообщение
chrono появился в C++11
Это какой то новый язык? Я не так давно устонавливал MSVS2008 вроде новая студия. Всего 6 лет назад заполучил диск с ней.
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
07.07.2013, 15:52     Генерация уникальных чисел #9
Hrobak, нет
Ваш код генерирует числа от 1 до 20 и перемешивает их.
Если умножать каждое число от 1 до 20 на случайное, то могут быть совпадения:
12*7=84
14*6=84
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 15:53     Генерация уникальных чисел #10
Olivеr, да, точно, не подумал.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Это какой то новый язык?
Новый стандарт языка, 2008 студия не поддерживает
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
07.07.2013, 15:53     Генерация уникальных чисел #11
Kuzia domovenok, это новый стандарт С++
http://ru.wikipedia.org/wiki/C%2B%2B11
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.07.2013, 17:18     Генерация уникальных чисел #12
Цитата Сообщение от Olivеr Посмотреть сообщение
Если умножать каждое число от 1 до 20 на случайное, то могут быть совпадения:
12*7=84
14*6=84
А откуда вытекает необходимость умножения вообще?
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
07.07.2013, 17:50     Генерация уникальных чисел #13
Цитата Сообщение от Tulosba Посмотреть сообщение
А откуда вытекает необходимость умножения вообще?
Цитата Сообщение от Hrobak Посмотреть сообщение
Olivеr, а нельзя к примеру взять мой код сверху, но еще дополнительно умножить каждый элемент массива на случайное число?
вот
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 17:53     Генерация уникальных чисел #14
Tulosba, просто хотелось модифицировать код для случайных чисел от 1 до n для другого диапазона; я ступил и предложил умножать их на случайные.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.07.2013, 19:48     Генерация уникальных чисел #15
Цитата Сообщение от Hrobak Посмотреть сообщение
просто хотелось модифицировать код для случайных чисел от 1 до n для другого диапазона
так надо просто константы поменять и всё.
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 20:00     Генерация уникальных чисел #16
Tulosba, не до конца понимаю как, можете привести пример?
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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;
}
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 20:33     Генерация уникальных чисел #18
Tulosba, но ведь так у нас просто от -4 до 5 числа. Я имел в виду домножать, чтобы перейти к примеру к диапазону от 1 до 10000, как бы расширить его.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.07.2013, 21:34     Генерация уникальных чисел #19
Hrobak, может я не так понял. Надо из диапазона 1...M выбрать N (N<=M) уникальных чисел или что?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2013, 23:44     Генерация уникальных чисел
Еще ссылки по теме:

Генерация уникальных случайных чисел C++
C++ Генерация чисел
C++ Метод поиска по массиву уникальных чисел за один проход
Отсортировать массив и подсчитать количество уникальных чисел в массиве C++
C++ Децентрализованная схема генерации уникальных чисел группой узлов

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

Или воспользуйтесь поиском по форуму:
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
07.07.2013, 23:44     Генерация уникальных чисел #20
Tulosba, изначально выбирается 20 чисел из диапазона 1..20. С этим проблем нет, мы просто записываем в массив 20 элементов последовательно и применяем std::random_shuffle. А я хотел, чтобы с помощью того же массива и std::random_shuffle генерить числа из бОльшего диапазона, например 1..10000.
Yandex
Объявления
07.07.2013, 23:44     Генерация уникальных чисел
Ответ Создать тему
Опции темы

Текущее время: 03:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru