các pro check giúp e đoạn code này cái! 
mục đích của đoạn code là chia cho số player (số player nhập từ bàn phím) mỗi người ngẫu nhiên 13 lá bài!
đoạn code của e sao đến phần “thao tac chia bai”
nó chỉ chia có 16 lá! :(( k hiểu vì sao!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace chiabai
{
class Program
{
//tao class bai
class bai
{
int quan;//quan: A 2 3 4 .... J Q K
int loai;//loai : ♥ ♦ ♣ ♠
//khoi tao khong tham so
public bai()
{
quan = 0;
loai = 0;
}
//khoi tao co tham so
public bai(int a, int b)
{
quan = a;
loai = b;
}
//khoi tao chep
public bai(bai a)
{
quan=a.quan;
loai=a.loai;
}
public void xuat()
{
switch (quan)
{
case 1: Console.Write("A"); break;
case 11: Console.Write("J"); break;
case 12: Console.Write("Q"); break;
case 13: Console.Write("K"); break;
default: Console.Write(quan); break;
}
switch (loai)
{
case 1: Console.Write("♥"); break;
case 2: Console.Write("♦"); break;
case 3: Console.Write("♣"); break;
case 4: Console.Write("♠"); break;
}
}
}
static void Main(string[] args)
{
bai[,] bbai;
byte[,] chia;//mang nay tinh xem quan bai da duoc chia chua?
chia = new byte[4, 13];//tuong ung voi vi tri cua la bai trong bo bai
bbai = new bai[4, 13];//mang bo bai gom 52 la 4x13
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 13; j++)
{
bbai[i, j] = new bai(j+1,i+1);
chia[i, j] = 0;
}
}
int player;
bai[,] pl;
pl=new bai[4,13];
Random ranq, ranl;
ranq = new Random();
ranl = new Random();
int q, l;
do
{
Console.Write("nhap so nguoi choi : ");
player = int.Parse(Console.ReadLine());
} while (player < 1 || player > 4);
//thao tac chia bai
int a, b;
for (a = 0; a < 13; a++)
{
for (b = 0; b < player; b++)
{
//lay ngau nhien la bai: ngau nhien gia tri va loai bai
do
{
q = ranq.Next(0, 13);
l = ranl.Next(0, 4);
} while (chia[l, q] == 1);//dieu kien: neu la bai chia roi thi lam lap lai thao tac
chia[l, q] = 1;//quan bai da duoc chia
pl[b, a] = bbai[l, q];//phat cho player
}
}
//xuat bai cua cac player
for (a = 0; a < player; a++)
{
Console.WriteLine("Nguoi choi " + (a + 1));
Console.Write(" ");
for (b = 0; b < 13; b++)
{
pl[a, b].xuat();
Console.Write(" ");
}
Console.WriteLine();
Console.WriteLine();
}
Console.ReadLine();
}
}
}
bạn debug từng vòng xem thử
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 13; j++)
{
bbai[i, j] = new bai(j+1,i+1);
chia[i, j] = 0;
}
}
kết thúc vòng lặp này thì i=?,j=? bạn xem lại vòng lặp này nha
do
{
q = ranq.Next(0, 13);
l = ranl.Next(0, 4);
} while (chia[l, q] == 1);//dieu kien: neu la bai chia roi thi lam lap lai thao tac
Bro xem lại chỗ này thử, em test vs player = 2, debug đến a = 8 bắt đầu có vấn đề
Random 1 hồi mới tìm ra được lá bài chưa chia :sad:
[QUOTE=12520980;188001]
do
{
q = ranq.Next(0, 13);
l = ranl.Next(0, 4);
} while (chia[l, q] == 1);//dieu kien: neu la bai chia roi thi lam lap lai thao tac
Bro xem lại chỗ này thử, em test vs player = 2, debug đến a = 8 bắt đầu có vấn đề
Random 1 hồi mới tìm ra được lá bài chưa chia :sad:[/QUOTE]
đó! đang thắc mắc chỗ đó mà! nói ở trên là không hiểu sao nó chỉ chia có 16 lá! với 2-3-4 player thì cũng chỉ chia 16 lá! 
mà có vấn đề là vấn đề j bạn?? nói rõ hơn được k? :-/
[QUOTE=09520109;187997]
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 13; j++)
{
bbai[i, j] = new bai(j+1,i+1);
chia[i, j] = 0;
}
}
kết thúc vòng lặp này thì i=?,j=? bạn xem lại vòng lặp này nha[/QUOTE]
i,j bằng bao nhiêu đâu có quan trọng?? mình chỉ cần nó lúc gán giá trị cho mấy lá bài ban đầu mà! về sau k xài nó nữa!! 
Sao không tạo mảng 52, rồi random 1-4 thôi cho nó lẹ?
[QUOTE=09520109;187997]
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 13; j++)
{
bbai[i, j] = new bai(j+1,i+1);
chia[i, j] = 0;
}
}
kết thúc vòng lặp này thì i=?,j=? bạn xem lại vòng lặp này nha[/QUOTE]
sorry nhìn nhầm khúc này
Chia thêm 1 lá => tỉ lệ random ra lá chưa chia giảm => vòng lặp lâu => thời gian tăng => đứng hình :oh:
[QUOTE=11520104;188002]đó! đang thắc mắc chỗ đó mà! nói ở trên là không hiểu sao nó chỉ chia có 16 lá! với 2-3-4 player thì cũng chỉ chia 16 lá! 
mà có vấn đề là vấn đề j bạn?? nói rõ hơn được k? :-/[/QUOTE]
[QUOTE=12520980;188007]Chia thêm 1 lá => tỉ lệ random ra lá chưa chia giảm => vòng lặp lâu => thời gian tăng => đứng hình :oh:[/QUOTE]
máy chứ có phải người đâu???
nói thêm cái tỷ lệ nhá! chia ra 16 lá! ta có tỷ lệ giữa chia rồi và chưa chi là 16:36 tỷ lệ lấy bài là 36/16 tứ là hơn 2/3! mắc j đứng hình? không tin tui làm cái lấy ngẫu nhiên 1 con bất kỳ, ngẫu nhiên cho đến lúc cần con chỉ định cho bạn xem!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Random k;
int d;
k = new Random();
for (; ; )
{
d = k.Next(1, 1000);
Console.WriteLine(d);
if (d == 78) break;
}
Console.ReadLine();
}
}
}
đây! chương trình lấy ngẫu nhiên 1 số trong 1000 số! break ra khi đến số 78! tỷ lệ lúc này là 1/1000 nó còn tìm ra! chứ chỉ tìm 1 lá trong 52 lá bài mà đứng hình như bạn nói thì quá vô lý!
pjo khắc phục được lỗi là lấy ngẫu nhiên từ 0-51 (1-52) lá bài! rùi từ đó tính ra được quan bài! nhưng mà vẫn không hiểu sao nếu lấy 2 cái random thì bị! 
là sao sếp???
nói rõ hơn giúp e với! :((
[QUOTE=07520182;188004]Sao không tạo mảng 52, rồi random 1-4 thôi cho nó lẹ?[/QUOTE]
[QUOTE=11520104;188042]là sao sếp???
nói rõ hơn giúp e với! :(([/QUOTE]
Tạo cái mảng 52 phần tử, từ 1 -> 13 là cơ, 14 -> 27 là rô…
Tạo thêm 1 mảng 4 phần tử Số lượng bài.
Chạy duyệt 52 phần tử này, đánh số random từ 1 -> 4 vào, nếu trúng thì cộng 1 vào cái mảng số lượng ở vị trí tương ứng, nếu số lượng quá 13 thì random lại ngay vị trí đó.
Rồi muốn xuất gì đó thì quét cái mảng 52 phần tử kia là được.
[QUOTE=07520182;188043]
Tạo thêm 1 mảng 4 phần tử Số lượng bài.
[/QUOTE]
cái mảng này là sao ạh?? e chưa hình dung được! @@
[QUOTE=11520104;188046]cái mảng này là sao ạh?? e chưa hình dung được! @@[/QUOTE]
Để đếm xem mỗi người đã random ra bao nhiêu bài, nếu quá 52/4=13 thì không random ra cho người đó nữa.
[QUOTE=07520182;188049]Để đếm xem mỗi người đã random ra bao nhiêu bài, nếu quá 52/4=13 thì không random ra cho người đó nữa.[/QUOTE]
àh! như z thì mình đặt 2 vòng for như trên là được! :-/ vấn đề là em không hiểu sao nếu đặt trong vòng for 2 cái random thì bị lỗi như đầu! còn đổi về 1 biến random trong vòng for thì chạy ok! 
Theo em biết thì hàm Random dựa trên bộ đếm thời gian của máy tính nên k hẳn là Random thực sự 
Bro sữa chỗ này thử nè
ranq = new Random(unchecked((int)DateTime.Now.Ticks));
ranl = new Random(unchecked((int)DateTime.Now.Ticks));

[QUOTE=12520980;188063]Theo em biết thì hàm Random dựa trên bộ đếm thời gian của máy tính nên k hẳn là Random thực sự 
Bro sữa chỗ này thử nè
ranq = new Random(unchecked((int)DateTime.Now.Ticks));
ranl = new Random(unchecked((int)DateTime.Now.Ticks));
[/QUOTE]
thanks! đúng là chuyển về như này thì chạy được!
pjo phát sinh thêm là sắp xếp các quân bài của các player theo thứ tự tăng dần!
code này để so sánh xem lá thứ nhất có lớn hơn lá thứ 2 không?
static byte sosanh(bai v, bai n)
{
if (v.q() > n.q()) return 1;
else if (v.l() < n.l()) return 1;
else return 0;
}
code này để hoán đổi vị trí của 2 lá bài
static void doi(bai a, bai b)
{
bai c;
c = new bai(a);
a = new bai(b);
b = new bai(c);
}
code này là thự hiện sắp xếp cho từng player
for (a = 0; a < 4; a++)
{
for (b = 0; b < 13; b++)
{
for (int c = 1; c < 13; c++)
{
if (sosanh(pl[a, c], pl[a, b]) == 1) doi(pl[a, c], pl[a, b]);
}
}
}
nhưng mà lúc chạy thì nó lại hiện lỗi!
ai biết chỉ giúp em luôn cái! (_ _!)

cái hàm v(), q() của bác là thế nào vậy?
Xài theo kiểu gợi ý trên kia thì có sẵn cái mảng tăng dần luôn 