Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 13.06.2020
Сообщений: 12
1

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

13.06.2020, 21:23. Показов 1567. Ответов 12

Author24 — интернет-сервис помощи студентам
Добрый день! Недавно начал изучение языка C++ и в одном из уроков, попалась задача по написанию игры блэк джек. Саму игру я написал, но мне не понравилась моя функция генерации случайных чисел. В чём суть. Есть двумерный массив(в одно значение это ранг карты(двойка, тройка и т.д.), а в другое значение масть(буба, креста и т.д.)) и мне надо заполнить массив не повторяясь в значениях(то есть строчка 2/2 может быть только один раз, а не 5 как у меня)))). Так вот вопрос как мне впилить условие, которое проверяет ранее введённые значения и в случае повтора отправляет на рандом обратно и так до тех пор пока не заполниться весь массив. Хотя в идеале был бы вариант, если можно было бы выбрать число из списка возможных, затем отключить его и заново искать из оставшихся.

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
#include <iostream>
#include <array>
#include <ctime> 
#include <cstdlib> 
#include <windows.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "ru");
 
    srand(time(NULL));
    
    int MyCard[1][53];
 
    for (int x = 1; x <= 52; x++)
    {
        int NewCard[1];
    
        MyCard[0][x] = NewCard[0];
        MyCard[1][x] = NewCard[1];
                        
    }
    
    int time = 0;
    for (int i = 1; i <= 52; i++)
    {
        cout << i << " - " << MyCard[0][i] << "/" << MyCard[1][i];
        cout << endl;
    }
    
    // Проверка
    int number;
    do
    {
        
        cin >> number;
        //for (int x = 0; x < 2; x++)
    //  {
            for (int y = 0; y < 53; y++)
            {
                if (MyCard[1][y] == number)
                    time++;
            }
        //}
        cout << "Количество повторов равно: ";
        cout << time;
        cout << endl;
 
        time = 0;
 
    } while (number != 20);
    
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2020, 21:23
Ответы с готовыми решениями:

Генерация случайных чисел
Здравствуйте, появилась такая проблема: при генерации случайного числа функцией rand(); мне нужно...

Генерация случайных чисел
Ребят, пишу программу, в которой используется генерация случайных чисел и именно в куске кода с ней...

Генерация случайных чисел
Для генерации случайных чисел использую выражение: x = rand() % 4; Библиотеку &lt;cstdlib&gt;...

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

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):

C++
1
2
3
4
5
        vector<int> x{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    default_random_engine dre;
    dre.seed(random_device()());
 
    shuffle(x.begin(), x.end(), dre);
Если заранее известно какие цифры и значения можно использовать - то проще всего заполнить какую-нибудь коллекцию возможными значениями, а потом её просто перемешать (
C++
1
shuffle(x.begin(), x.end(), dre)
)
Далее - из неё вытаскиваем значения и кладём в другую ("целевую") коллекцию. При добавлении нового значения - просто проверяем его - есть оно в "целевой" коллекции или нет. Если нет - то кладём, есть - вытаскиваем следующее из первой коллекции (которая перемешана), проверяем ну и т. д.
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
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <stdio.h>
#include <ctime>
using namespace std;
int number1;
int main()
{
    
    srand(time(0));
    number1 = rand()%10;
    cout << number1;
    
}
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
Цитата Сообщение от alexu_007 Посмотреть сообщение
В чем проблема тупо заполнить массив неповторяющимися случайными числами?
Медленно: придется каждое новое случайное число проверять было уже или нет и если было, генерить новое пока не появится уникальное, гораздо дешевле заполнить массив числами из диапазона последовательно и перетасовать массив
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
18.06.2020, 13:17 11
Цитата Сообщение от Annemesski Посмотреть сообщение
Медленно
Пф-ф-ф... Карт всего 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2020, 16:04
Помогаю со студенческими работами здесь

Генерация случайных чисел С++
сгенерировать вещественные числа от 0 до 1(например,0,1;0,2;1,0; и т.д.) в этом случае выводит...

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

Генерация случайных чисел
Доброго времени суток ! Как генерировать случайное число например в диапазоне от 1 до 52 а потом...

Генерация случайных чисел
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;clocale&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt;...

генерация случайных чисел
полазил по форумам, понял что лучшей конструкцией для ввода случайных чисел является:...

Генерация случайных чисел
Подскажите пожалуйста правильно ли я осуществил перевод строк из С в С++, сомневаюсь С - ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru