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

алгоритм для раздачи карт - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сжать массив, удалив из него все элементы. модуль которых не превышает, заданного числа. http://www.cyberforum.ru/cpp-beginners/thread797140.html
Дан одномерный массив. Сжать массив, удалив из него все элементы. модуль которых не превышает, заданно 20 числа а.
C++ Чтение с файла Нужно считать с файла данные и проверить их процедурою. Данный пример у меня работает с ввода вручную строки, а нужно так, что бы с файла взяла строку и проверила ее. #include "stdafx.h" #include <iostream> #include <stack> #include <cstdlib> #include <conio.h> using namespace std; void Check_Brackets (char *txt); http://www.cyberforum.ru/cpp-beginners/thread797133.html
Массивы. Описать функцию f(a, n, p), определяющую, упорядочены ли строго по убыванию элементы в целочисленном массиве a из n элементов... C++
Помогите пожалуйста с задачей! Описать функцию f(a, n, p), определяющую, упорядочены ли строго по убыванию элементы в целочисленном массиве a из n элементов, и вычисляющую целочисленное значение p. Если элементы упорядочены, то p - это сумма элементов, иначе p - это количество нарушений порядка в массиве a. С помощью этой функции провести анализ целочисленного массива a.
C++ Задачка про кривые Безье
Нужны советы (скорее алгоритмические) по одной задаче. Даны опорные точки кривой Безье, начальный и конечный параметры t0 и t1(0<t<1), а также значение ширины. Требуется "залить полосу" данной ширины вдоль кривой Безье, начиная с (x(t0),y(t0)) до (x(t1),y(t1)) причем желательно быстро. Важно то, что ширину нужно откладывать вдоль перпендикуляра к кривой в данной точке. Пробовал два...
C++ Работа со структурами http://www.cyberforum.ru/cpp-beginners/thread797121.html
Здравствуйте.У меня возникли проблемы в написании программы,а именно как удалить структуру,поиск в массиве по ключевому полю.Прошу вас помогите. #include<iostream.h> #include<stdlib.h> #include<string.h> #include<conio.h> struct WORKER {char familiya; char name; char otchestvo;
C++ Компонента связности в графе Нужна помощь с задачей, где нужно использовать графы. Смысл ее сводится к тому, чтобы узнать, какое минимальное количество ребер нужно вставить в граф, чтобы он стал связным (какое минимальное количество дорог нужно почистить, чтобы можно было добраться из любого города в любой другой). Если я не ошибаюсь, чтобы получить результат нужно найти количество компонент связности, и из этого числа... подробнее

Показать сообщение отдельно
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 184
28.02.2013, 14:30     алгоритм для раздачи карт
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "stdafx.h"
#include "poker.h"
#include <stdlib.h> // Отсюда берём rand()
#include <time.h> // Здесь находится time()
 
 
deck::deck(){
    srand((unsigned)time(NULL)); //раз в секунду - слишком медленно чтоб использовать внутри цикла
    Reload();
}
 
void deck::Reload(void){
/*Кодировка карт: карта представляет собой 1 байт (char)
  0,1,2,3 биты означают достоинство (2..Туза)
  2=1; 3=2; 4=3; 5=4; 6=5; 7=6; 8=7; 9=8; T=9; J=10; Q=11; K=12; A=13;
  4,5 биты означают масть
  в™*=0; в™Ј=1; ♦=2; ♥=3;*/
 
    //Заполняем колоду картами последовательно
    for (int i=0; i<=12; i++){cards[i] = i+1;}; //пики
    for (int i=13; i<=25; i++){cards[i] = (i-13+1)+16;};//трефы
    for (int i=26; i<=38; i++){cards[i] = (i-26+1)+32;};//бубны
    for (int i=39; i<=51; i++){cards[i] = (i-39+1)+16+32;};//черви
    
    Shuffle(); Shuffle(); Shuffle(); //Надо именно 3 раза!
}
bool deck::ConvertCard(unsigned char card, char* dest){
    unsigned char suit, value;
    suit = (card>>4);
    value = (card&0xF);
    if (value == 1) dest[0]='2';
    if (value == 2) dest[0]='3';
    if (value == 3) dest[0]='4';
    if (value == 4) dest[0]='5';
    if (value == 5) dest[0]='6';
    if (value == 6) dest[0]='7';
    if (value == 7) dest[0]='8';
    if (value == 8) dest[0]='9';
    if (value == 9) dest[0]='T';
    if (value == 10) dest[0]='J';
    if (value == 11) dest[0]='Q';
    if (value == 12) dest[0]='K';
    if (value == 13) dest[0]='A';
    if (suit == 0) dest[1]=6;//в™*
    if (suit == 1) dest[1]=5;//в™Ј
    if (suit == 2) dest[1]=4;//♦
    if (suit == 3) dest[1]=3;//♥
 
return 0;
}
 
unsigned char deck::GetCard(){
    char buff=0;
    for (int i=0; i<=51; i++){
        if(cards[i]!=255){buff = cards[i]; cards[i]=255; return buff;}
    }
    return 255; //ошибка, в колоде нет карт
}
void deck::Shuffle(){
    unsigned char buff, index;
    
    
    
    for(int i=0; i<=51; i++){
        index = rand()%52;
        buff = cards[i];
        cards[i]=cards[index];
        cards[index]=buff;
    }
}
unsigned char deck::CardFromStr(char* card){
    unsigned char buff = 255;
    if (card[0]=='2') buff=1;
    if (card[0]=='3') buff=2;
    if (card[0]=='4') buff=3;
    if (card[0]=='5') buff=4;
    if (card[0]=='6') buff=5;
    if (card[0]=='7') buff=6;
    if (card[0]=='8') buff=7;
    if (card[0]=='9') buff=8;
    if (card[0]=='T') buff=9;
    if (card[0]=='J') buff=10;
    if (card[0]=='Q') buff=11;
    if (card[0]=='K') buff=12;
    if (card[0]=='A') buff=13;
    if (buff==255) return 255;
    if (card[1]=='s') buff+=0;
    if (card[1]=='c') buff+=16;
    if (card[1]=='d') buff+=32;
    if (card[1]=='h') buff+=32+16;
    return buff;
}
bool deck::RemoveCard(unsigned char card){
    for (int i=0; i<=51; i++){
        if(cards[i]==card){cards[i]=255; return 0;}
    }
    return 1;
}
Почему мешать надо именно 3 раза. Хороший вопрос. А потому что либо функция rand() выдаёт чтото не случайное, либо алгоритм не случайный.

Я неполенился и проверил насколько случайно помешана колода (мне это важно)
И был сильно удивлён. Я мерял как часто скажем Туз пик оказывался на каком месте в колоде.
Так вот. при одном мешании при 10000 раздач. Разница между самым частым местом и самым редким = порядка 1000!!
При 2х мешаниях уже порядка 500
А при трёх в среднем уже порядка 300 и дальше не падает (ввиду нормального распределения)
Цыфры по памяти, може где ошибка, но суть верна.
 
Текущее время: 00:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru