0 / 0 / 0
Регистрация: 13.06.2020
Сообщений: 12
|
||||||
1 | ||||||
Генерация случайных чисел13.06.2020, 21:23. Показов 1567. Ответов 12
Добрый день! Недавно начал изучение языка C++ и в одном из уроков, попалась задача по написанию игры блэк джек. Саму игру я написал, но мне не понравилась моя функция генерации случайных чисел. В чём суть. Есть двумерный массив(в одно значение это ранг карты(двойка, тройка и т.д.), а в другое значение масть(буба, креста и т.д.)) и мне надо заполнить массив не повторяясь в значениях(то есть строчка 2/2 может быть только один раз, а не 5 как у меня)))). Так вот вопрос как мне впилить условие, которое проверяет ранее введённые значения и в случае повтора отправляет на рандом обратно и так до тех пор пока не заполниться весь массив. Хотя в идеале был бы вариант, если можно было бы выбрать число из списка возможных, затем отключить его и заново искать из оставшихся.
0
|
13.06.2020, 21:23 | |
Ответы с готовыми решениями:
12
Генерация случайных чисел Генерация случайных чисел Генерация случайных чисел Генерация случайных чисел |
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
|
|
13.06.2020, 22:18 | 2 |
Сообщение было отмечено NominoDominos как решение
Решение
NominoDominos, MyCard[1][53] - это массив из одной строки на 53 элемента. если колода из 54 карт, (52 основных) возможно Вам больше подойдёт массив MyCard[4][13] или map
насчёт заполнения уточните что Вам нужно - можно например заполнить массив всеми картами и перемешать
1
|
369 / 310 / 65
Регистрация: 14.10.2014
Сообщений: 1,318
|
|||||||||||
13.06.2020, 22:26 | 3 | ||||||||||
NominoDominos, можно к примеру, поступить так как сообщил Yetty, (для компиляции примера нужен С++11):
Далее - из неё вытаскиваем значения и кладём в другую ("целевую") коллекцию. При добавлении нового значения - просто проверяем его - есть оно в "целевой" коллекции или нет. Если нет - то кладём, есть - вытаскиваем следующее из первой коллекции (которая перемешана), проверяем ну и т. д.
1
|
0 / 0 / 0
Регистрация: 13.06.2020
Сообщений: 12
|
|
14.06.2020, 18:16 [ТС] | 4 |
Yetty, Recrut_rf спасибо большое! Блин я даже не подумал тупо взять массив и в нем перемешать все строки, а после по порядку из него брать значения! Блин это гениально СПАСИБО!!!!
Добавлено через 1 час 14 минут Вот что получилось: #include <iostream> #include <array> #include <ctime> #include <cstdlib> #include <windows.h> using namespace std; int main() { setlocale(LC_ALL, "ru"); srand(time(NULL)); int coloda[52][2] = { {2,1}, {3,1}, {4,1}, {5,1}, {6,1}, {7,1}, {8,1}, {9,1}, {10,1}, {11,1}, {12,1}, {13,1}, {14,1}, {2,2}, {3,2}, {4,2}, {5,2}, {6,2}, {7,2}, {8,2}, {9,2}, {10,2}, {11,2}, {12,2}, {13,2}, {14,2}, {2,3}, {3,3}, {4,3}, {5,3}, {6,3}, {7,3}, {8,3}, {9,3}, {10,3}, {11,3}, {12,3}, {13,3}, {14,3}, {2,4}, {3,4}, {4,4}, {5,4}, {6,4}, {7,4}, {8,4}, {9,4}, {10,4}, {11,4}, {12,4}, {13,4}, {14,4} }; for (int x = 0; x < 52; x++) { swap(coloda[x], coloda[rand() % 52]); } cout << "Size: " <<size(coloda) <<", Sizeof: " << sizeof(coloda) << endl; for (int x = 0; x < 52; x++) { for (int y = 0; y < 2; y++) { cout << coloda[x][y] << " "; } cout << endl; } system("pause"); return 0; }
0
|
4 / 3 / 1
Регистрация: 05.06.2020
Сообщений: 85
|
|
15.06.2020, 12:36 | 5 |
NominoDominos, ошибка
0
|
0 / 0 / 0
Регистрация: 13.06.2020
Сообщений: 12
|
|
16.06.2020, 11:52 [ТС] | 6 |
НеАдмин, Добрый день. Сборку программы проводил в Visual Studio 2019. Версия компилятора C++17.
Ваша проблема связана с отсутствием заголовочного файла Windows.h. Скорее всего вы запускаете код из под линукса(Ubuntu к примеру) или MacOS. Удалите заголовок #include Windos.h и в конце программы удалите строчку system("pause")(команда остановки в командной строке(только Windows)). Надеюсь моя инструкция Вам помогла
0
|
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
|
|
16.06.2020, 12:34 | 7 |
Для карточных игр подход такой:
1. Определяете массив карт - это колода - колода не может быть модифицирована (перетасована, обрезана, дополнена и т.д.) 2. Объявляете массив указателей с количеством элементов равным количеству элементов колоды, через указатели осуществляется доступ к элементам колоды. 3. Определяете несколько методов shuffle - тасовки колоды которые будут перемешивать массив указателей 4. Раздача карт в игру осуществляется через массив указателей Методы тасовки: 1. врезка - массив делится пополам, затем в результирующий массив сбрасывается по от 1 до 5 карт из первой половины, затем тоже из второй, потом опять из первой, пока не кончатся стопки. 2. перестановка - массив несколько раз (3 - 5) циклически сдвигается (вправо или влево неважно) на k элементов, k приблизительно равно четверти колоды. Тасовка осуществляется комбинацией методов, например: 5 тасовок в каждой из которых выполнятся от 4 до 7 перестановок, за которыми следует одна врезка.
0
|
4 / 3 / 1
Регистрация: 05.06.2020
Сообщений: 85
|
||||||
18.06.2020, 09:13 | 8 | |||||
0
|
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
|
|
18.06.2020, 10:32 | 9 |
В чем проблема тупо заполнить массив неповторяющимися случайными числами? ИМХО лучше шулерской тасовки.
0
|
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
|
|
18.06.2020, 13:04 | 10 |
Медленно: придется каждое новое случайное число проверять было уже или нет и если было, генерить новое пока не появится уникальное, гораздо дешевле заполнить массив числами из диапазона последовательно и перетасовать массив
0
|
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
|
|
18.06.2020, 13:17 | 11 |
Пф-ф-ф... Карт всего 54 (или 36). Набрать столько неповторяющихся чисел - микросекунды. Думаю, тасовать массив много раз (для получения гарантированно хорошего результата) не сильно быстрее.
0
|
0 / 0 / 0
Регистрация: 13.06.2020
Сообщений: 12
|
|
18.06.2020, 15:14 [ТС] | 12 |
alexu_007, изначально была такая идея. Хотел использовать массив MyArray[52][2], где первое значение ранг, второе масть, а третье очки, но чёт не вышло так. то масть не бьется, то повторы рангов слишком частые(к примеру троек вместо 4 шт. будет 7 шт.). В итоге код с проверками всеми и исправлениями всех этих бед вышел большой. А так сделал один массив, заполнил его и тасанул рандомно.
0
|
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
|
|
18.06.2020, 16:04 | 13 |
Ну каждый программист сам решает, какие выбрать данные и как с ними работать. Как ему удобнее. Можно просто пронумеровать карты 0-35. Четыре группы 0-8, 9-17, 18-26, 27-35. Делишь номер на 9: результат масть, остаток вес (6,7,8,9,10,B,Д,К,Т). Тогда и тасовать проблемы не будет. Можно взять структуру. Можно придумать ещё что-нить покруче - класс?
0
|
18.06.2020, 16:04 | |
18.06.2020, 16:04 | |
Помогаю со студенческими работами здесь
13
Генерация случайных чисел С++ Генерация случайных чисел Генерация случайных чисел Генерация случайных чисел генерация случайных чисел Генерация случайных чисел Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |