THINK JAVA: CÁCH SUY NGHĨ NHƯ NHÀ KHOA HỌC MÁY TÍNH - Trang 133

Deck deck =

new

Deck();

Bây gi vi c đ t các ph

ng th c thu c v các đ i t

ng

ờ ệ ặ

ươ

ộ ề

ố ượ Deck vào trong l i đ nh nghĩa l p

ờ ị

ớ Deck là h p

lý. Khi xem xét nh ng ph

ng th c mà ta đã vi t cho đ n gi , d th y m t ng c viên đó

ươ

ế

ế

ờ ễ ấ

ộ ứ

là printDeck (M c

ụ 13.7). Sau đây là dáng v c a nó, đ c vi t l i đ ho t đ ng v i

ẻ ủ

ượ

ế ạ ể

ạ ộ

ớ Deck:

public static void

printDeck(Deck deck) {

for

(

int

i = 0; i < deck.cards.length; i++) {

Card.printCard(deck.cards[i]);

}

}

M t s thay đ i là ki u c a tham s , t

ộ ự

ể ủ

ố ừ Card[] sang Deck.

Thay đ i th hai là ta không còn dùng đ

c

ượ deck.length đ l y chi u dài c a m ng, b i gi đây

ể ấ

deck đã

là m t đ i t

ng

ộ ố ượ Deck, ch không ph i m t m ng. Nó ch a m t m ng, nh ng nó không ph i là m ng.

ư

B i v y ta ph i vi t

ở ậ

ế deck.cards.length đ k t xu t đ c m ng t đ i t ng

ể ế

ấ ượ

ừ ố ượ Deck r i l y chi u dài c a

ồ ấ

m ng này.

V i lý do t

ng t , ta ph i dùng

ươ

deck.cards[i] đ truy c p m t ph n t c a m ng, thay vì ch vi t

ầ ử ủ

ỉ ế deck[i].

S thay đ i cu i cùng là vi c kích ho t

ạ printCard ph i nói rõ r ng

ằ printCard đ c đ nh nghĩa trong

ượ ị

l p

ớ Card.

14.2 Tráo bài

Trong ph n l n các trò ch i bài tây, b n c n ph i tráo c bài; nghĩa là x p bài theo m t tr t t ng u

ầ ớ

ơ

ạ ầ

ế

ậ ự

nhiên. M c 12.6

Ở ụ

ta đã th y cách phát sinh s ng u nhiên, song th t không d th y cách áp d ng đ

ễ ấ

tráo c bài.

M t kh năng là mô ph ng cách con ng

i tráo bài, th

ng là chia c bài làm đôi r i ch n bài đan xen

ườ

ườ

t t ng ph n. B i ng

i th

ng không th tráo chính xác theo cách này đ

c, nên sau ch ng 7 l n l p

ừ ừ

ườ

ườ

ượ

ầ ặ

l i thao tác thì c bài d

ng nh đã hoàn toàn ng u nhiên. Song m t ch

ng trình máy tính thì l i có

ườ

ư

ươ

đ c đi m luôn tr n bài th t hoàn h o nên k t qu s không th t ng u nhiên. Th c t là, sau 8 l n tr n,

ế

ả ẽ

ự ế

máy s làm cho c bài v nguyên tr ng. B n có th xem thông tin thêm

http://en.wikipedia.org/wiki/Faro_shuffle.
M t thu t toán tr n bài h p lý h n là trong m i l n duy t ch l t m t lá bài, và m i l n l p thì ch n l y

ơ

ỗ ầ

ỉ ậ

ỗ ầ ặ

ọ ấ

hai lá bài r i đ i ch chúng.

ồ ổ

Sau đây là phác th o cách ho t đ ng c a thu t toán này. Đ phác h a ch

ng trình, tôi k t h p câu l nh

ạ ộ

ươ

ế ợ

Java v i ngôn ng nói, mà đôi khi đ

c g i là

ượ ọ

gi mã

:

for

(

int

i = 0; i < deck.cards.length; i++) {

// chọn một số nằm giữa 1 và deck.cards.length-1

// đổi chỗ lá bài thứ i và lá bài ngẫu nhiên được chọn

}

Đi u hay gi mã là nó th

ng làm rõ nh ng ph

ng th c nào mà b n s p c n có. Trong tr

ng h p

ở ả

ườ

ươ

ạ ắ ầ

ườ

này, ta c n m t th nh

ư randomInt, đ ch n m t s nguyên ng u nhiên gi a

ể ọ

ộ ố

ữ low và high,

và swapCards đ nh n vào hai ch s r i đ i ch hai lá bài v trí các ch s đó.

ỉ ố ồ ổ

ở ị

ỉ ố