Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
3 / 3 / 0
Регистрация: 24.11.2014
Сообщений: 40
1

Нужно сделать рандом без повторений

16.03.2015, 21:26. Показов 2404. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я хочу написать карточную игру Дурак. Во мне и нужно чтоб 2-ое игроков получули разн*е карт*.
Как осуществить ето с помощю рандома ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2015, 21:26
Ответы с готовыми решениями:

Рандом без повторений
Здравствуйте! Искал по форуме, но так и не нашел подходящее решение такой задачи: пользователь вводит К ПРИМЕРУ число 7. я беру от него...

Рандом без повторений
Random part = new Random(); int numb = new int; for (int j = 0; j < numb.Length; j++) { numb =...

Рандом без повторений
<? $max = 11; include "games_array.php"; $RANDOM1 = rand(1,$max); $RANDOM2 = rand(1,$max); ...

9
Эксперт С++
 Аватар для hoggy
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.03.2015, 21:32 2
Цитата Сообщение от Fenix1123581321 Посмотреть сообщение
Как осуществить ето с помощю рандома ?
создать массив карт.
перемешать массив.

в цикле извлекать карты из массива, раздавая их игрокам.
1
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
16.03.2015, 21:34 3
например перед раздачей сортировать рандомно массив карт(они ж у вас в массиве наверно?). получить два числа рандомно- индексы эл в массиве, и поменять их местами, и так несколько раз, получится некая тусовка колоды перед раздачей, это пока все что придумалось....
0
Эксперт С++
 Аватар для hoggy
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.03.2015, 21:43 4
http://rextester.com/SQWS74586

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
#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
 
    //упорядочная колода
    std::vector<size_t> cards;
    for(size_t n=0; n<54; ++n)
        cards.emplace_back(n);
    
    //перемешали
    std::random_shuffle(cards.begin(), cards.end() );
    
 
    //раздаем:
    std::cout << "карты первого игрока: ";
    for(size_t n=0; n<6; ++n)
        std::cout << cards.back() << ' ',
        cards.pop_back();
    std::cout << '\n';
    
    std::cout << "карты второго игрока: ";
    for(size_t n=0; n<6; ++n)
        std::cout << cards.back() << ' ',
        cards.pop_back();
    std::cout << '\n';
 
    std::cout << "остаток карт в колоде: ";
    for (size_t n : cards) 
        std::cout << n << ' '; 
    std::cout << '\n';
 
}
1
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
16.03.2015, 21:45 5
Цитата Сообщение от hoggy Посмотреть сообщение
random_shuffle(cards.begin(), cards.end()
По какому принципу работает эта функция?
0
Эксперт С++
 Аватар для hoggy
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.03.2015, 21:48 6
Цитата Сообщение от _Valera_ Посмотреть сообщение
По какому принципу работает эта функция?
по принципу "перемешать случайный образом".
конгруэнтный алгоритм.

строго говоря это не обязательно. можно установить любой другой генератор псч.
1
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
16.03.2015, 21:51 7
Цитата Сообщение от hoggy Посмотреть сообщение
конгруэнтный алгоритм.
Где то можно найти код? Или идею алгоритма?
0
Эксперт С++
 Аватар для hoggy
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.03.2015, 22:02 8
Цитата Сообщение от _Valera_ Посмотреть сообщение
Где то можно найти код? Или идею алгоритма?
1.
Идею подробно жуёт Кнут в своей книге.

Так же, вы можно получить просто тонны материалов по запросу яндекса или гугла.

2.
Исходный код стандартной библиотеки ищите в потрохах стандартной библиотеки своего компилятора.

3.
Пример простейшего коэнгурэнтного рандома.
Я создал его после прочтения толмутов Кнута.

(работает только под виндовс, потому что использует ассемблер)

http://rextester.com/LHCQ59265

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
namespace Den{
 
    struct Dice
    {
        static int Random(int minVal, int maxVal)
        {
            if(minVal>maxVal) 
            {
                const int tmp = minVal;
                minVal = maxVal;
                maxVal = tmp;
            }
            return RND()%(maxVal - minVal + 1) + minVal;
        }
    private: 
        static int GetTick()
        {
            int timeNOW;
            _asm
            {
                rdtsc;
                mov [timeNOW],eax;
            }
            return timeNOW;
        }
        static int RND() 
        { 
            static int seed = GetTick();
            return ( ((seed = seed * 214013L + 2531011L ) >> 16)& 0x7fff);
        }
    };
 
}//namespace Den
 
 
 
 
#include <iostream>
 
int main()
{
    std::cout << "Hello, world!\n";
    
    for(size_t n=0; n<20; ++n)
        std::cout<< Den::Dice::Random(0,100)<<", ";
    std::cout<<'\n';
}
В последствии в потрохах одной из портов стандартной библиотеки я нашел практически точно такую же формулу, как у меня.

А поскольку свою формулу я не мудрствуя лукаво скомуниздил у Кнута,
то полагаю разработчики стандартной библиотеки так же его прочитали.
1
случайный прохожий
 Аватар для gunslinger
3163 / 2168 / 636
Регистрация: 20.07.2013
Сообщений: 5,822
16.03.2015, 22:04 9
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  randomize();
  const n = 36;  // количество значений
  int a[n], i, j;
 
  for (i = 0; i < n; i++)
    a[i] = random(n)+1;  // инициализация
 
  // каждое значение сравниваем со всеми предыдущими
  for (i = 1; i < n; i++)
    for (j = 0; j < i; j++)
      if (a[i] == a[j])  // если значения совпадают
      {
        a[i] = random(n)+1;  // то получаем новое значение
        j = -1;  // и снова сравниваем полученное значение со всеми предыдущими
      }
1
Эксперт С++
 Аватар для hoggy
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.03.2015, 22:12 10
есть ещё вот такая тема:

http://rextester.com/MRG83174

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
#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
 
    //упорядочная колода
    std::vector<size_t> cards;
    for(size_t n=0; n<54; ++n)
        cards.emplace_back(n);
    
    //перемешали
    std::shuffle(cards.begin(), cards.end(), std::mt19937{std::random_device{}()});
    
    //std::random_shuffle(cards.begin(), cards.end() );
    
 
    //раздаем:
    std::cout << "карты первого игрока: ";
    for(size_t n=0; n<6; ++n)
        std::cout << cards.back() << ' ',
        cards.pop_back();
    std::cout << '\n';
    
    std::cout << "карты второго игрока: ";
    for(size_t n=0; n<6; ++n)
        std::cout << cards.back() << ' ',
        cards.pop_back();
    std::cout << '\n';
 
    std::cout << "остаток карт в колоде: ";
    for (size_t n : cards) 
        std::cout << n << ' '; 
    std::cout << '\n';
 
}

Обратите внимание на: std::mt19937

Это на самом деле так называемый Mersenne Twister 19937 generator

Я не могу вам сказать, в чем там штука (не специалист по этой части).

Однако, mersenne используют в профессиональных разработках,
которые критичны к качеству "случайности".

Считается, что он лучше коэнгурэнтных версий.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2015, 22:12
Помогаю со студенческими работами здесь

Рандом без повторений
Как рандомом заполнить файл БЕЗ повторений чисел?

Рандом без повторений
При нажатии на кнопку сгенерировать число от 1 до 10, которое не будет повторятся при повторном нажатии на кнопку. Цикл будет прекращаться...

Рандом без повторений
Есть рандом от 1 до 8... Как сделать так, чтобы если рандом выкинул цифру, то после, он ее уже не повторял?

Псевдо-рандом без повторений
Всем доброго времени суток, появилась такая проблема, нужно приложения с рандомом, но рандом только на словах, на самом деле есть список...

Рандом без повторений на php
Добрый день. Помогите решить задачку. У меня есть переменные, например $a $b $c и т.д. которым присвоено некое значение. Эти...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Вопросы на собеседовании по Android
mobDevWorks 14.03.2025
По данным статистики, Android занимает более 70% мирового рынка мобильных операционных систем, что делает платформу привлекательной как для начинающих разработчиков, так и для опытных профессионалов. . . .
Лучшие игровые движки для Python
py-thonny 14.03.2025
Python обеспечивает разработчиков игр мощными движками и фреймворками, которые позволяют воплотить практически любую идею — от простой аркады до визуального романа с разветвленным сюжетом. Главное. . .
Бессерверный JavaScript: Разработка масштабируемых API с AWS Lambda
run.dev 14.03.2025
Но что такое бессерверные вычисления на самом деле? По сути, это модель облачных вычислений, где разработчик фокусируется исключительно на создании бизнес-логики, не тратя время на настройку. . .
Безопасность кода в C++26: Менеджеры ресурсов и висячие ссылки
NullReferenced 14.03.2025
C++ всегда был языком, предоставляющим разработчикам большие возможности и гибкость, но вместе с тем требующим ответственности. Одной из самых коварных проблем даже для опытных программистов остаются. . .
smart-agent proper interface settings (2025)
jigi33 14.03.2025
Smart-agent proper interface settings (mart 2025). (see screenshots to look at "Etalon" ARM)
Продвинутые настройки JVM
Javaican 14.03.2025
Стандартные параметры запуска JVM хороши для повседневной разработки, но совершенно недостаточны для высоконагруженных систем. Представьте, что вы запускаете финансовую платформу, обрабатывающую. . .
CI/CD для приложений Java с Azure DevOps и Docker
Mr. Docker 14.03.2025
Разработка современных Java-приложений немыслима без системы непрерывной интеграции и доставки (CI/ CD). Azure DevOps в сочетании с Docker предоставляет мощный инструментарий для создания таких. . .
Разработка на PHP и интернет вещей (IoT)
Jason-Webb 14.03.2025
Интернет вещей (IoT) произвел настоящую революцию в способах взаимодействия устройств с окружающим миром. В эпоху, когда холодильники сами заказывают молоко, а термостаты учатся вашим привычкам,. . .
Node.js 20: Новые возможности и улучшения производительно­сти
Reangularity 14.03.2025
Что же принёс нам релиз Node. js 20? В первую очередь, это существенные улучшения в производительности. Движок V8 получил серьёзные оптимизации, благодаря чему JavaScript-код выполняется заметно. . .
Безопасность кластеров Apache Kafka
Javaican 14.03.2025
Apache Kafka стал одним из ключевых компонентов современных архитектур, обрабатывающих потоки данных в режиме реального времени. Его используют тысячи компаний от стартапов до технологических. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер