0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 29
1

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

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

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

Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2013, 00:17
Ответы с готовыми решениями:

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

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

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

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

20
1404 / 646 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
07.07.2013, 00:28 2
C++
1
for(int i=0; i<100; ++i)

Если чисел немного, то можно радномно генерировать и забивать в map, а потом смотреть - было оно, или нет. Большим map не должен получиться, т.к. числа генерируются равномерно на отрезке.
0
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
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
414 / 410 / 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
4023 / 3280 / 920
Регистрация: 25.03.2012
Сообщений: 12,270
Записей в блоге: 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
414 / 410 / 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
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
07.07.2013, 15:48 7
Olivеr, а нельзя к примеру взять мой код сверху, но еще дополнительно умножить каждый элемент массива на случайное число?
0
4023 / 3280 / 920
Регистрация: 25.03.2012
Сообщений: 12,270
Записей в блоге: 1
07.07.2013, 15:52 8
Цитата Сообщение от Olivеr Посмотреть сообщение
chrono появился в C++11
Это какой то новый язык? Я не так давно устонавливал MSVS2008 вроде новая студия. Всего 6 лет назад заполучил диск с ней.
0
414 / 410 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 15:52 9
Hrobak, нет
Ваш код генерирует числа от 1 до 20 и перемешивает их.
Если умножать каждое число от 1 до 20 на случайное, то могут быть совпадения:
12*7=84
14*6=84
1
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
07.07.2013, 15:53 10
Olivеr, да, точно, не подумал.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Это какой то новый язык?
Новый стандарт языка, 2008 студия не поддерживает
0
414 / 410 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 15:53 11
Kuzia domovenok, это новый стандарт С++
http://ru.wikipedia.org/wiki/C%2B%2B11
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.07.2013, 17:18 12
Цитата Сообщение от Olivеr Посмотреть сообщение
Если умножать каждое число от 1 до 20 на случайное, то могут быть совпадения:
12*7=84
14*6=84
А откуда вытекает необходимость умножения вообще?
0
414 / 410 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 17:50 13
Цитата Сообщение от Tulosba Посмотреть сообщение
А откуда вытекает необходимость умножения вообще?
Цитата Сообщение от Hrobak Посмотреть сообщение
Olivеr, а нельзя к примеру взять мой код сверху, но еще дополнительно умножить каждый элемент массива на случайное число?
вот
0
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
07.07.2013, 17:53 14
Tulosba, просто хотелось модифицировать код для случайных чисел от 1 до n для другого диапазона; я ступил и предложил умножать их на случайные.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.07.2013, 19:48 15
Цитата Сообщение от Hrobak Посмотреть сообщение
просто хотелось модифицировать код для случайных чисел от 1 до n для другого диапазона
так надо просто константы поменять и всё.
0
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
07.07.2013, 20:00 16
Tulosba, не до конца понимаю как, можете привести пример?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 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
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
07.07.2013, 20:33 18
Tulosba, но ведь так у нас просто от -4 до 5 числа. Я имел в виду домножать, чтобы перейти к примеру к диапазону от 1 до 10000, как бы расширить его.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.07.2013, 21:34 19
Hrobak, может я не так понял. Надо из диапазона 1...M выбрать N (N<=M) уникальных чисел или что?
0
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
07.07.2013, 23:44 20
Tulosba, изначально выбирается 20 чисел из диапазона 1..20. С этим проблем нет, мы просто записываем в массив 20 элементов последовательно и применяем std::random_shuffle. А я хотел, чтобы с помощью того же массива и std::random_shuffle генерить числа из бОльшего диапазона, например 1..10000.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2013, 23:44
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru