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

Srand в карточной игре - C++

Восстановить пароль Регистрация
 
Clive
0 / 0 / 0
Регистрация: 14.06.2015
Сообщений: 22
28.07.2015, 06:55     Srand в карточной игре #1
подскажите как сделать так что бы
srand выдавал числа в диапазоне от 1 до 36 без повторов
можно ли это сделать без массивов ?

делаю задание ( создать игру 21) это для понимания для чего мне это нужно

мне нужно что бы ни игроку ни компьютеру не попадались карты которые уже были

пишу в visual studio
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2015, 06:55     Srand в карточной игре
Посмотрите здесь:

C++ srand(time(0))
C++ Srand
srand C++
Алгоритм ходов компьютера в карточной игре "Дурак" C++
srand не компилится C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Butt-Head
Заблокирован
28.07.2015, 10:35     Srand в карточной игре #2
Цитата Сообщение от Clive Посмотреть сообщение
как сделать так что бы
srand выдавал числа в диапазоне от 1 до 36
srand не выдаёт числа, он лишь настраивает "зерно", выдаёт значения функция rand.
В двух словах, rand - это псевдослучайные числа, srand нужен для создания видимости случайности, то есть если ты сделаешь по классике srand ( time(NULL) );, то твой rand будет каждый раз выдавать случайные числа, т.к. время будет всё время разным. В общем, rand выдаёт одну и ту же последовательность чисел для одинаковых аргументов srand, вызванных перед ним.

Цитата Сообщение от Clive Посмотреть сообщение
без повторов
можно ли это сделать без массивов ?
нет, т.к. тебе нужно где то ловить эти повторы.

В общем вот твой код:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <set>
#include <vector>
 
int main()
{
    srand(time(NULL)); //генерим булщить, чтоб числа были случайные на этот раз
    std::set<int> uniqueData; //чисто для того, что б накопить 35 уникальных значений
    std::vector<int> result;
    while(uniqueData.size() < 35) //тебе нужно 35 чисел, раз с 1-го ...
    {
        int randNumber = rand() % 36 + 1; //до 36-и за счёт %36, от одного за счёт + 1
        if(uniqueData.count(randNumber) == 0)
        {
            result.push_back(randNumber); //добавляю в результат и они там будут в порядке добавления
            uniqueData.insert(randNumber); //если б результат брал отсюда, было бы просто 35 чисел по возрастанию, т.к. set и map - сортированны по умолчанию
        }
    }
 
    std::cout << "Result:" << std::endl;
    for(int i = 0; i < result.size(); i++)
        std::cout << "value " << i << " : " << result[i] << std::endl;
 
    int x;
    std::cin >> x;  //чтоб программа в левых IDE сразу не вылетала и ты мог видеть рузельтат
 
    return 0;
}
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
28.07.2015, 10:38     Srand в карточной игре #3
Делается это не через рендмо 1 к 36.

1) Создать класс карта
2) создать класс колода из карт
3) создать класс дилер, который имеет 3-4 колоды( у вас почему только 1 колода) :
3.1) дилер перед игрой сортирует колоду рендомно и потом тупо вытягивает верхнюю карту.

Добавлено через 2 минуты
Butt-Head, Ну вы поняли ))))) Алгоритм не вах.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1865 / 1661 / 578
Регистрация: 14.05.2014
Сообщений: 4,771
Записей в блоге: 1
Завершенные тесты: 5
28.07.2015, 10:42     Srand в карточной игре #4
Цитата Сообщение от Butt-Head Посмотреть сообщение
тебе нужно 35 чисел
В колоде 36 карт, почему 35-то???
Butt-Head
Заблокирован
28.07.2015, 11:18     Srand в карточной игре #5
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
В колоде 36 карт, почему 35-то???
ТС говорил
Цитата Сообщение от Clive Посмотреть сообщение
srand выдавал числа в диапазоне от 1 до 36 без повторов
я про игру даже и не думал

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Ну вы поняли ))))) Алгоритм не вах.
Да... я особо не заморачивался.
Ну раз сам понт кинул - покажи лучше, ради спортивного интереса
Kerry_Jr
28.07.2015, 11:36
  #6

Не по теме:

Цитата Сообщение от Butt-Head Посмотреть сообщение
ТС говорил
Враки, ни слова о 35. От 1 до 36 - это 36.

rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
28.07.2015, 11:49     Srand в карточной игре #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <algorithm>
 
int main( )
{
    const int deckSize = 36;
    std::vector<int> deck;
 
    for(int i = 0; i < deckSize; i++)
        deck.push_back( i + 1 );
 
    std::random_shuffle( deck.begin( ), deck.end( ) );
 
    for(int i = 0; i < deckSize; i++)
        std::cout << deck[i] << " ";
 
    return 0;
}
Добавлено через 15 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <algorithm>
 
int main( )
{
    const int deckSize = 36;
    std::vector<int> deck;
 
    for(int i = 0; i < deckSize; i++)
        deck.push_back( i + 1 );
 
    std::random_shuffle( deck.begin( ), deck.end( ) );
 
    for(int i = 0; i < deckSize; i++)
        std::cout << deck[i] << " ";
 
    return 0;
}
Butt-Head
Заблокирован
28.07.2015, 12:03     Srand в карточной игре #8
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Враки, ни слова о 35.
Слова скрыты между строк. Вникай внимательно:
Цитата Сообщение от Clive Посмотреть сообщение
srand выдавал числа в диапазоне от 1 до 36 без повторов
Что бы генератор случайных чисел выдал числа от 1 до 36 без повторов, он должен выдать ровно 35 чисел

rikimaru2013, рандом шафл оййойой, как круто Но по условиям TC-а, следует использовать именно srand и rand!
Так то можно было бы заюзать #include <random>, глянь тут пример - http://en.cppreference.com/w/cpp/num...l_distribution
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1865 / 1661 / 578
Регистрация: 14.05.2014
Сообщений: 4,771
Записей в блоге: 1
Завершенные тесты: 5
28.07.2015, 12:29     Srand в карточной игре #9
Цитата Сообщение от Butt-Head Посмотреть сообщение
он должен выдать ровно 35 чисел
а ничего страшного, если я повторюсь и скажу, что в колоде 36 карт, а от 1 до 36 - это 36 чисел, т.к. 36 входит в диапазон. А теперь посмотри на свой код, который генерирует числа от 1 до 36 включительно, но записывает в вектор только 35 из них.
Butt-Head
Заблокирован
28.07.2015, 12:50     Srand в карточной игре #10
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
а от 1 до 36 - это 36 чисел, т.к. 36 входит в диапазон
Да, действительно
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
А теперь посмотри на свой код, который генерирует числа от 1 до 36 включительно, но записывает в вектор только 35 из них.
На самом деле он генерить от 1-го до 37-и, так что там много косяков, короче должно быть так:
C++
1
2
3
while(uniqueData.size() < 36) 
    {
        int randNumber = rand() % 35 + 1;
Добавлено через 16 секунд
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
а от 1 до 36 - это 36 чисел, т.к. 36 входит в диапазон
Да, действительно
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
А теперь посмотри на свой код, который генерирует числа от 1 до 36 включительно, но записывает в вектор только 35 из них.
На самом деле он генерить от 1-го до 37-и, так что там много косяков, короче должно быть так:
C++
1
2
3
while(uniqueData.size() < 36) 
    {
        int randNumber = rand() % 35 + 1;
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1865 / 1661 / 578
Регистрация: 14.05.2014
Сообщений: 4,771
Записей в блоге: 1
Завершенные тесты: 5
28.07.2015, 13:13     Srand в карточной игре #11
Цитата Сообщение от Butt-Head Посмотреть сообщение
от 1-го до 37-и,
теперь, видимо, мне придется биться головой о стену и доказывать, что твой код правильно генерировал от 1 до 36. 36%36 = 0, поэтому rand() % 36 + 1 будет генерировать числа от 1 до 36 включительно.

Добавлено через 3 минуты
только это здесь не нужно. Проще тупо заполнить в цикле числами от 1 до 36 и не мучиться с рандомом.

Добавлено через 15 секунд
только это здесь не нужно. Проще тупо заполнить в цикле числами от 1 до 36 и не мучиться с рандомом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2015, 22:59     Srand в карточной игре
Еще ссылки по теме:

rand, srand и т.д C++
Как сделать систему ходов в карточной игре? C++
Srand C++

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

Или воспользуйтесь поиском по форуму:
Clive
0 / 0 / 0
Регистрация: 14.06.2015
Сообщений: 22
28.07.2015, 22:59  [ТС]     Srand в карточной игре #12
Всем спасибо сделал через Массив ( хоть мы его еще не проходили) но вроде все получается
Yandex
Объявления
28.07.2015, 22:59     Srand в карточной игре
Ответ Создать тему
Опции темы

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