Dãy Số Ngẫu Nhiên Không Hoàn Toàn Ngẫu Nhiên - nói dối e blog

Dãy Số Ngẫu Nhiên Không Hoàn Toàn Ngẫu Nhiên

Từng có một chiến lược đánh bạc được đề xuất như sau: Trong trò chơi đỏ đen với tỷ lệ thắng thua 1:1, giả sử nhà cái không gian lận, xác suất ra “lớn” và “nhỏ” đều là 50%. Người chơi bắt đầu với mức cược 1 đồng, nếu thua thì ván sau cược gấp đôi (2 đồng), tiếp tục nhân đôi nếu vẫn thua. Khi thắng, người chơi sẽ luôn có lợi nhuận ròng 1 đồng và quay về mức cược ban đầu.

Trông có vẻ như chiến lược này đảm bảo lợi nhuận vĩnh viễn. Nhưng tại sao không ai dùng cách này để phát tài?

Trong thực tế, những người áp dụng chiến lược này thường lỗ sạch vốn (dù là trò chơi nào thì kết cục cũng tương tự). Đừng đổ lỗi cho vận may hay nghi ngờ nhà cái gian lận, bởi chiến lược này đã chứa mầm thất bại từ đầu.

Hãy thay trò chơi đỏ đen bằng thí nghiệm tung đồng xu. Xác suất xuất hiện mặt ngửa 7 lần liên tiếp là bao nhiêu?

Người có kiến thức xác suất cơ bản có thể tính nhẩm: 1/128 (~0.78%). Khó hơn nhiều so với việc tung xúc xắc 20 mặt để ra số 20 trong trò Dungeons & Dragons (xin vái một cái cho may mắn!).

Bây giờ hãy thử tính xác suất xuất hiện ít nhất một chuỗi 7 mặt ngửa liên tiếp khi tung đồng xu 30 lần. Qua chương trình mô phỏng, kết quả thật bất ngờ: 18.3%, cao hơn trực giác nhiều người tưởng tượng.

Điều này có ý nghĩa gì? Nếu bạn chỉ có 128 đồng vốn, trong 30 ván cược, xác suất cháy túi đã lên tới 9.53%. Dù có thể gặp may mắn ban đầu, nhưng để tiếp tục chiến lược, bạn cần gấp đôi vốn lên 256 đồng - điều gần như bất khả thi trong 30 ván.

Bạn có thể tăng vốn để chịu đựng chuỗi thua dài hơn, nhưng vốn cần thiết tăng theo cấp số nhân trong khi xác suất thành công chỉ tăng tuyến tính. Chỉ cần chơi vài tiếng trong sòng bạc, dù vốn lớn đến đâu cũng sẽ cạn kiệt.

Cuộc chơi cuối cùng là cuộc đua về tiềm lực tài chính, không phải về may mắn (xin đừng giận dữ, thần tài!). Nếu không có tiềm lực ngang nhà cái, tốt nhất nên dừng lại sớm. Nhân tiện, lời khuyên này cũng dành cho những ai đang “đánh bạc” trên thị trường chứng khoán A.

Tôi tin rằng bất kỳ người có tư duy lý tính nào cũng sẽ mất hứng với cờ bạc. Đa số độc giả blog tôi đều như vậy, thực ra hôm nay tôi muốn nói về trò chơi điện tử :)

Chúng tôi vừa bắt đầu thử nghiệm nội bộ một trò chơi thẻ bài. Trong bộ bài 50 lá, một đồng nghiệp đã cho vào 25 lá sinh vật, cho rằng xác suất rút được lá sinh vật là 50%. Tuy nhiên trong thực tế, gần như ván nào cũng xảy ra tình trạng 5 lần liên tiếp không rút được lá sinh vật.

Ban đầu chúng tôi nghi ngờ hàm ngẫu nhiên giả của hệ thống không đủ “ngẫu nhiên”. Thay đổi thuật toán vẫn không cải thiện tình hình.

Qua tính toán, tôi phát hiện: Trong 30 lần rút bài, xác suất xuất hiện chuỗi 5 lá không phải sinh vật liên tiếp lên tới 36.82%. Khi số lần rút tăng lên 44, xác suất này vượt 50% (50.32%). Với mỗi ván bài có hơn 30 lần rút, việc gặp chuỗi 5 lá không mong muốn là hoàn toàn bình thường, không thể đổ lỗi cho thuật toán ngẫu nhiên hay cơ chế xáo bài.

Để kiểm chứng, tôi lấy xúc xắc 20 mặt ra thử nghiệm. Quy định số 1-10 là “nhỏ”, 11-20 là “lớn”, tiếp tục tung cho đến khi ra chuỗi 5 lần “lớn” liên tiếp. Dự đoán ban đầu là cần khoảng 100 lần tung, nhưng kết quả thực tế chỉ cần 22, 24 và 31 lần trong 3 thí nghiệm.

Nếu bạn muốn thử, có thể dùng đồng xu hoặc xúc xắc 6 mặt để kiểm chứng.

Vì vậy, khi chơi game online mà thấy tỷ lệ rơi đồ hay ghép đồ thấp hơn công bố, đừng trách vận may hay nghi ngờ hệ thống. Việc tạo ra dãy ngẫu nhiên “gian lận” vừa khó che giấu quy luật, vừa tốn nhiều tài nguyên tính toán hơn dùng hàm ngẫu nhiên hệ thống. Ví dụ như dùng chuỗi Niederreiter.

Cuối cùng, tôi chia sẻ một hình ảnh ngẫu nhiên được tạo bằng chương trình C:

!random.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int i,j;
    int map[128][128];
    memset(map,0,sizeof(map));
    for (i=0;i<1000;i++) {
        map[rand()%128][rand()%128]=1;
    }
    printf("P1\n128 128\n");
    for (i=0;i<128;i++) {
        for (j=0;j<128;j++) {
            printf("%d ",map[i][j]);
        }
        printf
0%