Những chương trình Java đầy ma thuật

Chạy chương trình dưới đây 101 lần thì nó cũng không trả về chuỗi số ngẫu nhiên. Thật không thể tin nổi, chính chúng tôi cũng không thể tin nổi, thật tuyệt vời!

 

“Ngẫu nhiên mà lại không ngẫu nhiên”

Giải thích: class java.util.Random [1] sinh giá trị ngẫu nhiên dựa trên thuật toán “Trình tạo đồng dư tuyến tính” (Linear congruential generator: LCG)

Có 4 toán hạng là: n, c1, c2, m.
Có 1 biến số là n.
Có 3 hằng số là c1, c2 và m.
Toán tử % là phép lấy đồng dư.
Giá trị n được gán giá trị mới sau mỗi vòng lặp đệ quy. Với số lượt tạo giá trị ngẫu nhiên không đủ lớn thì chưa thể tạo tính ngẫu nhiên cho chuỗi giá trị sinh ra. Để hiểu thêm về cơ chế sinh giá trị ngẫu nhiên này, bạn xem thêm cuốn sách của Donald Knuth có tên “Nghệ thuật lập trình”, tập 2, phần 3.2.1 nhé. (Donald Knuth, The Art of Computer Programming, Volume 2, Section 3.2.1.).

Thật vậy, viết một chương trình nhỏ, lần này không in ra 10 số ngẫu nhiên đầu tiên, mà in ra 100 số ngẫu nhiên đầu tiên, tính chất ngẫu nhiên xuất hiện:

magic_act

Chương trình dưới đây, tại sao lại trả về 1?

magci_wand_clear

Để in ra một chuỗi “hello world”, có nhất thiết phải kỳ quặc thế này không?

[1] https://docs.oracle.com/javase/8/docs/api/java/util/Random.html

Chúng tôi có làm sẵn project chứa các đoạn code trên để bạn tải về và chạy thử: Magic
Clone/fork từ repository Github: https://github.com/SmartJobVN/MagicJava

Đỗ Như Vý – developer tại SmartJob


algorithm,
chương trình java,
data type,
java,
lập trình viên java,
random,