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

просто интересуюсь - C++

Восстановить пароль Регистрация
 
Noxior
3 / 3 / 0
Регистрация: 07.06.2009
Сообщений: 129
23.02.2012, 02:18     просто интересуюсь #1
1. надо сделать чтобы полностью рандомные числа неповторялись...
srand(time(NULL)) написал.
2. какую сортировку лучше всего использовать? Для будущих программ необходимо все методы знать, или 1 будет достаточно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2012, 02:18     просто интересуюсь
Посмотрите здесь:

C++ просто 2*2
C++ Очень просто(x^3)
C++ Всё просто
C++ просто вопрос=)
Очень просто C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
23.02.2012, 02:38     просто интересуюсь #2
Цитата Сообщение от Noxior Посмотреть сообщение
1. надо сделать чтобы полностью рандомные числа неповторялись...
srand(time(NULL)) написал.
Полностью рандомных чисел не бывают, хороший генератор случайных чисел это не столь простая задача как кажется на первый взгляд. Ну да не думаю что тебе это глубоко интересно, после того как ты засеял генератор случайных чисел от времени числа и так генерируются случайные в заданном тобой диапазоне при использовании rand(), что тебе ещё не нравиться? Если хочешь чтобы при каждом запуске они гарантированно не повторялись то можешь например сохранять их в файле, а при запуске сверяться с файлом что такие числа ещё не выпадали, а если такое число уже было - сгенерировать случайное число ещё раз , только это всё не целесообразно же.

Цитата Сообщение от Noxior Посмотреть сообщение
2. какую сортировку лучше всего использовать? Для будущих программ необходимо все методы знать, или 1 будет достаточно?
На практике лучше всего использовать сортировку из stl, а не свою написанную
Noxior
3 / 3 / 0
Регистрация: 07.06.2009
Сообщений: 129
23.02.2012, 02:47  [ТС]     просто интересуюсь #3
какую именно сортировку?
алгоритмов сортировок из stl много
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
23.02.2012, 03:06     просто интересуюсь #4
Цитата Сообщение от Noxior Посмотреть сообщение
1. надо сделать чтобы полностью рандомные числа неповторялись...
srand(time(NULL)) написал.
Полностью согласен с Вами Gepar
Цитата Сообщение от Gepar Посмотреть сообщение
хороший генератор случайных чисел это не столь простая задача
Существует еще такая уловка, когда генератором случайных чисел является пользователь. То есть отслеживаем время следующего нажатия клавиши или клика мыши. Недостаток - необходимость диалога. Преимущество - случайность.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
23.02.2012, 03:22     просто интересуюсь #5
Чтобы числа не повторялись и вся эта мешанина выглядела буолее или менее перемешаной, тут посмотри
Перемешивание двухмерного массива
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
23.02.2012, 08:24     просто интересуюсь #6
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/////////////////////////////////////////////////////////////////////////////////////////
//Надо сделать чтобы полностью рандомные числа не повторялись.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <set>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::set<int>   T_set;
/////////////////////////////////////////////////////////////////////////////////////////
bool  successfully_get_unique_rand
    (         
        int     rand_min,
        int     rand_max,
        int&    res
    )
{
    static T_set    old_results;
    int             rand_numbers_total  =   rand_max - rand_min + 1;
 
    bool            bool_res            =       rand_numbers_total >  0
                                            &&  rand_numbers_total <= RAND_MAX + 1
                                            &&  old_results.size() <  unsigned( rand_numbers_total );
 
    if( bool_res )
    {
        do
        {
            res = rand() % rand_numbers_total + rand_min;
        }while( old_results.count(res) );
 
        old_results.insert(res);
    }
    return  bool_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()  
{
    srand(unsigned(time(0)));    
 
    int     rand_min    =   rand() % 10 - rand() % 10;
    int     rand_max    =   rand() % 10 - rand() % 10;
 
    std::cout   <<  "rand_min = "
                <<  rand_min
                <<  std::endl
                <<  "rand_max = "
                <<  rand_max
                <<  std::endl;
    
    int     rand_val    =   0;
    while
        (
            successfully_get_unique_rand
                (                    
                    rand_min,
                    rand_max,
                    rand_val
                )
        )
    {
        std::cout   <<  rand_val
                    <<  std::endl;
    }
}
Russian_Dragon
 Аватар для Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
23.02.2012, 08:43     просто интересуюсь #7
Что-то как-то замудрили.
Не повторяющиеся числа, в пределах одного запуска, сделать очень просто.
Нужна коллекция и итератор.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int maxNumber = 100;// максимальное число
vector<int> vectorNumbers;
vector<int>::iterator p;
 
void FillInVector(){
vectorNumbers.clear();
for(int i = 0; i < maxNumber; i++)
vectorNumbers.push_back(i);
p = vectorNumbers.first();
}
 
//пишем "рандомную" функцию для удобства
int myRand(){
p = vectorNumbers.first();
int r = p + rand()%vectorNumbers.size();
vectorNumbers.remove(p);
if(vectorNumbers.size() == 0) void FillInVector();
return r;
}
Вот и всё.
Суть простая мы случайно извлекаем из коллекции числа, а потом это число удаляем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2012, 09:09     просто интересуюсь
Еще ссылки по теме:

C++ просто логарифм
C++ Просто интересно
C++ просто так

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.02.2012, 09:09     просто интересуюсь #8
Или так
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
27
28
29
30
31
32
#include <iostream>
#include <array>
#include <stdexcept>
 
const int MAX_RAND = 1e5;
 
int unique_rand( int max_rand )
{   
    if ( max_rand > MAX_RAND )
        return -1;
        
    static std::array< bool, MAX_RAND > arr;
    
    int res;    
        
    do
    {
        res = rand() % max_rand;
    } while ( arr[res] == true );
    
    arr[res] = true;
    
    return res;
}
 
int main()
{   
    for (int i = 0; i < 10; ++i)
    {
        std::cout << unique_rand( 10 ) << std::endl;
    }
}
Должно работать быстрее, чем вариант с сортировкой, но будет зацикливание, когда массив полностью заполнится, ну и просто может тормозить, если свободные числа заканчиваются.
Цитата Сообщение от Noxior Посмотреть сообщение
какую именно сортировку?
алгоритмов сортировок из stl много
Две всего.
std::sort и std::stable_sort
Первая быстрее, вторая стабильнее.
Ну и еще есть различные контейнеры вроде set'a и priority_queue, а также nth элемент, но это не совсем сортировка.
Yandex
Объявления
23.02.2012, 09:09     просто интересуюсь
Ответ Создать тему
Опции темы

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