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

Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании) - C++

Восстановить пароль Регистрация
 
CHELOVEKPAUK
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
29.06.2014, 22:31     Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании) #1
Задание звучит так:

Карточка лотереи имеет нумерованные поля, из которых случайным образом выбирается определенное количество
номеров. Напишите функцию Lotto (), принимающую два аргумента. Первым должно быть число номеров на карточке лотереи, а вторым — количество случайным образом выбранных номеров. Функция должна возвращать объект
vector<int>, содержащий отсортированные по порядку случайно выбранные номера. Эту функцию можно использовать, например, так:

vector<int> winners;
winners = Lotto(51,6);

Этот код присвоил бы объекту winners вектор, содержащий шесть случайным образом выбранных номеров в диапазоне от 1 до 51. Обратите внимание, что простого использования rand() не достаточно для решения этого упражнения, потому что она может генерировать дублированные значения. Совет: пусть функция создает вектор, который содержит все возможные значения, затем применяйте random_shuffle(), после чего используйте начало перетасованного вектора для получения значений. Также напишите короткую программу для тестирования разработанной функции.


Я не могу понять - зачем здесь требуется функция random_shuffle, ведь проблема состоит в том, что rand может генерировать одинаковые значения, следовательно нужно применить функцию unique. Ведь если мы все значения местами поменяем, дублированные значения никуда не денутся! Подскажите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2014, 22:31     Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании)
Посмотрите здесь:

задании первый класс вводиться по порядку а уже втором классе некоторый ввод перескакивает через одну C++
Целесообразность использования цикла. C++
Пользователь вводит отдельно строку и символ, необходимо показать на экран номера по порядку всех совпадений (нумерация с единицы) C++
C++ random_shuffle случайное перемешивание
C++ Массивы. Отсортировать 100 самых больших чисел в порядке убывания и добавить отсортированные числа в созданный 3 массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
29.06.2014, 22:39     Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании) #2
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Я не могу понять - зачем здесь требуется функция random_shuffle, ведь проблема состоит в том, что rand может генерировать одинаковые значения, следовательно нужно применить функцию unique.
Да в принципе можно и так.
Что касается задания, то ключевое здесь:
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
пусть функция создает вектор, который содержит все возможные значения
т.е. они предлагают создать массив из 51 элемента, а потом его перетасовать случайным образом и первые 6 элементов взять за номера.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
30.06.2014, 00:01     Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании) #3
CHELOVEKPAUK, вполне логично, это самый простой способ получить массив случайных неповторяющихся чисел.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.06.2014, 11:39     Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании) #4
Когда то писал:
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
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>
 
std::vector<int> Lotto(unsigned all_balls, unsigned count) {
   std::vector<unsigned> balls(all_balls);
   std::iota(balls.begin(), balls.end(), 1);
 
   std::mt19937 gen(std::chrono::system_clock::now().time_since_epoch().count());
 
   for (unsigned i = 0; i < 10; ++i) {
      std::shuffle(balls.begin(), balls.end(), gen);
      std::shuffle(balls.rbegin(), balls.rend(), gen);
      std::shuffle(balls.begin(), balls.begin() + all_balls/2, gen);
      std::shuffle(balls.begin() + all_balls/2, balls.end(), gen);
   }
 
   return std::vector<int>{balls.begin(), balls.begin() + count};
}
 
int main()
{
   std::cout << "Enter number of tickets: -> ";
   size_t tickets = 1;
   std::cin >> tickets;
   std::cout << "Enter number of balls: -> ";
   size_t balls;
   std::cin >> balls;
   std::cout << "Enter number of count: -> ";
   size_t count;
   std::cin >> count;
 
   while (tickets--)
   {
      std::this_thread::sleep_for(std::chrono::milliseconds(100));
      auto ticket = Lotto(balls, count);
      for (auto& i : ticket) {
         std::cout << std::setw(2) << std::right
                   << i << " ";
      }
      std::cout << "\n";
   }
 
   std::cout << "\nGood Luck!" << std::endl;
 
   return 0;
}
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
30.06.2014, 11:41     Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании) #5
DiffEreD, а смысл в нескольких перемешиваниях? Это как мой один знакомый писал для большей случайности функцию
C++
1
2
3
4
double myrand()
{
   return (rand() + rand() + rand())/3;
}

Знающий твимс да поймет
Yandex
Объявления
30.06.2014, 11:41     Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании)
Ответ Создать тему
Опции темы

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