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

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

Войти
Регистрация
Восстановить пароль
 
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
#1

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

29.06.2014, 22:31. Просмотров 458. Ответов 4
Метки нет (Все метки)

Задание звучит так:

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

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

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


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

Целесообразность использования цикла. - C++
Этот момент в универе нам не объясняли. Хочу сразу сказать, я знаю зачем, как и когда используются циклы. Собственно возник не большой...

задании первый класс вводиться по порядку а уже втором классе некоторый ввод перескакивает через одну - C++
# include &quot;stdafx.h&quot; # include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;windows.h&gt; #include &lt;tchar.h&gt; using...

Целесообразность использования LINQ - C# ASP.NET
Доброго времени суток, уважаемые! Хочу немного освоить (понять &quot;соль&quot;) ASP.net MVC и пр. сопутствующих технологий. Так как уже...

Целесообразность использования глобальных счётчиков - Visual C++
В своём коде я выработал привычку всегда объявлять счётчики глобальными. Например вместо: ... int main() { ... for(int i00 = 0;...

Присвоение номера по порядку - MS Access
Добрый день! прошу помощи!!! есть таблица Проверка, в ней поля ПДата01 - дата протокола проверки ПНомер - номер протокола ...

В файле символьного типа перевернуть каждую строку по порядку без использования массива - Pascal ABC
В файле символьного типа перевернуть каждую строку по порядку без использования массива. например было: травка зеленеет солнышко...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
29.06.2014, 22:39 #2
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Я не могу понять - зачем здесь требуется функция random_shuffle, ведь проблема состоит в том, что rand может генерировать одинаковые значения, следовательно нужно применить функцию unique.
Да в принципе можно и так.
Что касается задания, то ключевое здесь:
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
пусть функция создает вектор, который содержит все возможные значения
т.е. они предлагают создать массив из 51 элемента, а потом его перетасовать случайным образом и первые 6 элементов взять за номера.
1
Psilon
Master of Orion
Эксперт .NET
5891 / 4788 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
30.06.2014, 00:01 #3
CHELOVEKPAUK, вполне логично, это самый простой способ получить массив случайных неповторяющихся чисел.
1
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.06.2014, 11:39 #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;
}
1
Psilon
Master of Orion
Эксперт .NET
5891 / 4788 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
30.06.2014, 11:41 #5
DiffEreD, а смысл в нескольких перемешиваниях? Это как мой один знакомый писал для большей случайности функцию
C++
1
2
3
4
double myrand()
{
   return (rand() + rand() + rand())/3;
}

Знающий твимс да поймет
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2014, 11:41
Привет! Вот еще темы с ответами:

Строки: Найти номера первой и последней по порядку запятой - VBA
Здравствуйте. Помогите пожалуйста со следующим заданием: Найти номера первой и последней по порядку запятой. Заменить запятые на...

Согласовать два потока для вывода номера по порядку - C++
Собственно надо согласовать два потока для вывода номера по порядку. Пробую библиотеку std:: Нарисовал нечто следующее, но выдает...

Поиск номера первого по порядку элемента целочисленного массива - Turbo Pascal
Составьте программу поиска номера первого по порядку элемента целочисленного массива A(N), взаимно простого с заданным натуральным числом К

Нахождение номера первого по порядку положительного элемента одномерного массива - Turbo Pascal
Составьте прогу нахождения номера первого по порядку положительного элемента одномерного массива W(N)


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.06.2014, 11:41
Ответ Создать тему
Опции темы

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