BO GIAO DUC VA DAO TAO DAI HOC HUE
TRUONG DAI HOC KHOA HOC
NGUYEN THI THUY
NGHIEN CUU MOT SO THUAT TOAN SINH SO NGAU NHIEN VA UNG DUNG
LUAN VAN THAC SI KHOA HOC
CONG NGHE THONG TIN
Thira Thién Hué, 2020
Trang 2
BO GIAO DUC VA DAO TAO ĐẠI HỌC HUE
TRƯỜNG ĐẠI HỌC KHOA HỌC
NGUYEN THI THUY
NGHIEN CUU MOT SO THUAT TOAN
SINH SO NGAU NHIEN VA UNG DUNG CHUYEN NGANH: KHOA HOC MÁY TÍNH
MA SO: 8480101
LUAN VAN THAC Si KHOA HOC DINH HUONG UNG DUNG
NGUOI HUONG DAN KHOA HOC TS TRAN THANH LUONG
Thừa Thiên Hué, 2020
Trang 3LOI CAM DOAN
Tôi xin cam đoan đây là công trình nghiên cứu của riêng cá nhân tôi, dưới sự hướng dẫn khoa học của TS Trần Thanh Lương Các kết quả nêu trong luận văn là trung thực và chưa từng được công bố trong bất kỳ công trình khoa học nào khác Mọi thông tin tham khảo đều được trích dẫn đầy đủ và chính xác
Thừa Thiên Huế, ngày tháng năm 2020 Học viên
Trang 4LOI CAM ON
Lời đầu tiên, tôi xin gởi lời cảm ơn chân thành sâu sắc đến Quý thầy cô giáo Khoa Công nghệ thông tin, Trường Đại học Khoa học, Đại học Huế đã tận tình hướng dẫn, truyền đạt kiến thức, tạo điều kiện thuận lợi trong quá trình học tập và thực hiện luận văn tốt nghiệp
Tôi xin chân thành gửi lời biết ơn đến TS Trần Thanh Lương, người thầy đã hướng dẫn tận tình và có những góp ý sâu sắc, hướng dẫn rất quý báu cho tôi trong suốt quá trình nghiên cứu, kịp thời cho tôi nhiều lời động viên cũng như những nhận xét đúng đắn để tôi có thê hoàn thành tốt được đề tài này
Trong quá trình thực hiện để tài, xin chân thành gửi lời cảm ơn đến sự giúp đỡ, những lời động viên từ phía gia đình, đồng nghiệp, bạn bè là động lực to lớn giúp tơi hồn thành tốt đề tài nghiên cứu của mình Tôi cũng gửi lời cảm ơn đến Trường THPT Quang Trung An Khê, nơi tôi đang công tác đã tạo điều kiện đi học và thực hiện đề tài nghiên cứu này
Bản thân tôi đã cố gắng hết sức trong quá trình thực hiện để tài này nhưng chắc chắn sẽ không tránh khỏi những thiếu sót Kính mong quý thầy cô và các bạn tận tình góp ý, chỉ bảo
Xin chan thanh cam on!
Thừa Thiên Huế, ngày tháng năm 2020 Học viên
Nguyễn Thị Thụy
Trang 5MUC LUC
Trang LỜI CAM ĐOAN nh uưe i LOT CAM ON wooo ii \/080/ 9005 2 4 ul DANH MỤC CÁC CHỮ VIẾT TẮTT - 52 222225222512211211121112111221221222 xe Vv
MO DAU ooo cccccccccceeeesssssssssssssnssssserteseeeesseeessssnsnnssssimmeeseeeeesssssnnnsssemeeseeeseessssen 1
CHƯƠNG 1 TỎNG QUAN VỀ SÓ NGẪU NHIÊN 5c ca 4 1.1 Khái niệm về số ngẫu nhiên ©2222222222251221121112111211211221211 xe 4 1.2 Lịch sử của số ngẫu nhiên 22-222 222225121512211213121112111111211211 2 xe 5 1.3 Phân loại số ngẫu nhiên 22 22 22222512251211121112111211121111121222 xe 6 1.3.1 Các đặc điểm của số ngẫu nhiên 2- 22222221222122211221222122ee 6 1.3.2 S gi ngu nhiờn 2-â2222222122211211121112111211211212122 e6 Đ 1.3.3 Số ngẫu nhiên thật sự -2- 22 222222122211211122121212122 xe § 1.3.4 So sánh số giả ngẫu nhiên và số ngẫu nhiên thật sự 9 1.4 Ứng dụng của số ngẫu nhiên 22 2222211221221211211221.21222 e6 10 1.4.1 Ứng dụng trong mô phỏng 222 222 2221221122122212212211221 222 22e 10 1.4.2 Ứng dụng trong trò chơi điện tử -2-2222222222122212221222 xe 10 1.4.3 Ứng dụng trong mã hóa thơng tỉn -.©-2-2222222122122212221 22.22 11 1;4:4: Gác:'ứng:dung khéeicrscccmnmenwunencememcemeneene RR 11 1.5 Hàm tạo số ngẫu nhiên trong một số ngôn ngữ lâp trình . - 12 1.5.1 Tạo số ngẫu nhiên trong ngôn ngữ C/C++ 22-22222222 cszev 12 1.5.2 Tạo số ngẫu nhiên trong ngôn ngữ Java ©-2-22s222zc22zcsze2 13 1.5.3 Tạo số ngẫu nhiên trong ngôn ngữ Python 2-22 22z22zcsze2 16 1.6 Tiểu kết Chương Ì 2-22: 22222122212212112112112112222222 re 17 CHƯƠNG 2 MỘT SỐ PHƯƠNG PHÁP TẠO SÓ NGẪU NHIÊN 19 2.1 Giới thiệU SE HH HH HH HH He 19 2.2 Hàm phân phối xác suất 22222 22122212221221211221121121122112212 te 19 2.2.1 Khái niệm biến ngẫu nhiên -2- 22 2222222221121112111211212 2 xe 19 2.2.2 Luật phân phối xác suất của biến ngẫu nhiên -2- 2-5522 20 2.2.3 Hàm mật độ xác suất của biến ngau 50 0c cssskcssssx 20
Trang 62.2.4 Ham phan phéi xdc suat cia bién ngau nhién eee 21 2.3 Một số thuật toán tạo số ngẫu nhiÊN - .- 21 222111115111 151211 11221111221 xe2 21 2:3:1: Phương: pháp ChUHEssezzrseessssetserescatiithosgiii8ORSi-XSGRG1143X08800AG8881x088 22 2.3.2 Phương pháp bình phương gIữa - S21 nnhnhhrheere 23 2.3.3 Phương pháp đồng dư bậc hai 2-52 2222222211121112111212211 2e 27 2.3.4 Phương pháp đồng dư tuyến tính - 22 2222222225222312111212 22-2 31 2.3.5 Phương pháp đồng dư cộng - 222 22222222122111221211212 xe 35 2:4: 3o:sánh đánh: giá:các ThưậP TOÁN sss2xessinseosseBSeDSAEESGHĐ4EEL000038082usneB8 40 2.4.1 Đánh giá tính hiệu quả các thuật toán - ìccccccscsccreieierrey 40 2.4.2 Đánh giá thuật toán dựa trên thời gian chạy của các thuật toán 41
2.5 Tiểu kết Chương 2 222222 2221221222121122112112112112211221122222 re 42 CHƯƠNG 3 ỨNG DỤNG SINH SÓ NGẪU NHIÊN TRONG VIỆC ĐÁNH SỐ PHÁCH CHO THÍ SINH THAM DỰ CÁC KỲ THI - 5: 5522zss22 43
3.1 Phát biểu bài toán 22:2222222222211221122111221122112111 211 E1 re 43
3.2 Quy trình đánh phách cho bài th1 -.- 5c c St 32t S2 Etrsrxerrrrrrrerres 44
3.2.1 Dồn túi bài thi -:222: 2222 22112221222112211221211211211 2e 44
3.2.2 Đánh số phách bài thi 2- 22s 2212221121122121121121221.2 xe 46
km 47 3.3.1 Tổ chức đữ liệu :©222:2222222122221122211223122112211 21122121 cee 47 3.3.2 Thực hiện dơn túi -¿:©22¿222222212222122231221122112211 22122 cee 50
3.3.3 Thực hiện đánh phách cho bài th1 à 52c Sccccxscxsrrerrrrerreee 51 3.3.4 Đánh giá hiệu quả của các phương pháp sinh số ngẫu nhiên sau khi áp dụng vào bài toán thực tế đánh phách cho thí sinh trong các cuộc thi 52 3.4 Tiểu kết chương 3 252222 221222122122112211212212222222222 2e 53 KET LUAN VA HƯỚNG PHÁT TRIỂN 222222212221222222.2.22 xe 54
TÀI LIỆU THAM KHẢO 2222: 222222222112222112221122111221122212 E2 55
Trang 7KET LUAN VA HUONG PHAT TRIEN
KET LUAN
Số ngẫu nhiên đã được chứng minh có nhiều ứng dụng trong thực tế ở các lĩnh vực khác nhau của cuộc sống như: trò chơi điện tử, mô phỏng hệ thống, sinh số liệu để thực nghiệm, đánh phách cho thí sinh, Sau một thời gian tim hiểu và nghiên cứu về số ngẫu nhiên, luận văn đã đạt được một số kết quả như sau đây:
e Khái quát và hệ thống lại một số khái niệm cơ bản về số ngẫu nhiên, lịch sử nghiên cứu về sô ngâu nhiên
e Trình bày những cách thức và các hàm tạo số ngẫu nhiên trong các ngôn ngữ lập trình khác nhau để minh họa thêm cho quá trình tạo số ngẫu nhiên bằng máy tính điện tử
e Hệ thống các phương pháp tạo số ngẫu nhiên như: phương pháp bình phương giữa, phương pháp đồng dư bậc hai, phương pháp đồng dư tuyến tính, phương pháp đồng dư cộng Trên cơ sở đó, so sánh, đánh giá về tính hiệu quả của các phương pháp sinh số ngẫu nhiên
© Áp dụng các thuật toán sinh số ngẫu nhiên vào bài toán đánh số phách cho thí sinh dự thi Cài đặt chương trình để minh họa cho quy trình đánh số phách bằng
ngôn ngữ C/C”"
HUONG PHAT TRIEN
Trong thời gian tới, trên cơ sở những kết quả đạt được, tôi sẽ tiếp tục nghiên cứu theo các định hướng như sau:
e Tiếp tục nghiên cứu về các phương pháp sinh số ngẫu nhiên khác và đánh giá các phương pháp sinh số ngẫu nhiên đó để có cơ sở áp dụng vào các lĩnh vực phù hợp
e Tìm hiểu và đưa ra một phương pháp sinh số ngẫu nhiên tốt hơn phương pháp đồng dư cộng dé cho dé tai này thật sự là một tài liệu bé ich trong viéc lua chọn áp đụng các phương pháp tạo sinh số ngẫu nhiên vào các bài tốn thực tế
© Nghiên cứu về mô phỏng ngẫu nhiên, như là phương pháp Monte Carlo
Trang 8MO DAU
Số ngẫu nhiên theo cách hiểu thông thường là một số bất kỳ nào đó không có quy luật để sinh ra nó Số ngẫu nhiên có ứng dụng rất nhiều trong cuộc sống của chúng ta từ số xố cho đến mật mã học Trong toán học, người ta có quan điểm cho rằng “số ngẫu nhiên là số có khả năng xuất hiện tương đương nhau” Tuy nhiên, tùy theo từng tỉnh huống, ngữ cảnh sử dụng, chúng ta cần phải giới hạn các số ngẫu nhiên được dùng trong một phạm vi nhất định Như vậy, không thể có một số nguyên ngẫu nhiên bất kỳ mà chỉ có một số nguyên ngẫu nhiên trong một miền xác định nào đó Ngoài ra, trong nhiều trường hợp, chúng ta không chỉ cần một số ngẫu nhiên mà phải cần đến một hoặc nhiều dãy số ngẫu nhiên trong những phạm vi xác
định trước
Thoạt nhìn, số ngẫu nhiên có vẻ đơn giản, nhưng việc sinh ra một dãy số thực sự ngẫu nhiên thực chất lại rất khó, đặc biệt là đối với máy tính Đến nay, không có phương pháp nào để sinh ra số ngẫu nhiên thực sự từ máy tính Một lý do chính là các máy tính hiện nay đều tất định tức là, chúng hoạt động và cho ra kết quả theo một hướng đuy nhất, có thể dự đoán được Nghĩa là, chúng ta gần như không thê viết được một chương trinh tạo ra các số một cách hoản toàn ngẫu nhiên Bởi vì khi ta viết chương trình để máy tính tạo ra các số ngẫu nhiên thì các số ngẫu nhiên đó phải do chương trình tao ra và phải tuân theo một thuật toán nhất định Do đó, chúng ta có thể suy luận được số ngẫu nhiên đó dựa vào quy luật sinh số ngẫu nhiên Điều này dẫn đến số được tạo ra không còn là ngẫu nhiên nữa
Trang 9Hơn nữa, nếu chọn giá trị ban đầu đủ tốt và dãy có chu kỳ lặp lại đủ lớn, ta gần như không thể phân biệt giữa dãy giả ngẫu nhiên và đấy thực sự ngẫu nhiên
Vì những khó khăn nêu trên, chúng ta sẽ sinh ra những số có nhiều thuộc tính giống như các số ngẫu nhiên Các số này thường được gọi là các số giả ngẫu nhiên (pseudorandom number viết tắt là PRN) Dé cho quá trình làm việc được thuận lợi, trong để tài này chúng ta thống nhất gọi các số giả ngẫu nhiên là số ngẫu nhiên Những số giả ngẫu nhiên này không thật sự ngẫu nhiên nhưng chúng có thể hữu dụng giống như các số ngẫu nhiên Trong luận văn này, chúng ta sẽ nghiên cứu để tao ra các số giả ngẫu nhiên nhưng có nhiều tính chất giống hoặc gần giống của số ngâu nhiên
Hiện nay, chúng ta có nhiễu thuật toán tạo số ngẫu nhiên như: thuật toán bình phương giữa, thuật toán đồng dư bậc hai, thuật toán đồng dư tuyến tính, thuật toán đồng dư cộng Hầu hết các thuật toán này đều đáp ứng được các tiêu chí sau:
e Những số được tạo ra phải phân bố đều và độc lập về mặt thống kê Giá trị của một số trong một chuỗi số ngẫu nhiên không liên quan đến giá trị của số kế tiếp Chuỗi số ngẫu nhiên sinh ra không được lặp lại với bất kỳ độ dài nào
e Tốc độ sinh số ngẫu nhiên phải nhanh đề đáp ứng quá trình mô phỏng thực hiện trên một lượng lớn các số ngẫu nhiên Vì nếu công cụ sinh số ngẫu nhiên có tốc độ chậm thì chi phí thực hiện mô phỏng sẽ rat cao
e Thuật toán sinh số ngẫu nhiên sử dụng càng ít bộ nhớ càng tốt Bởi vì chương trình mô phỏng thường xuyên yêu cầu bộ nhớ lớn, trong lúc bộ nhớ hiện nay thường bị giới hạn, nhất là đối với các thiết bị có giá thành thấp
Đề hiểu về cách sinh ra các số ngẫu nhiên cũng như xây dựng ứng dụng từ các số ngẫu nhiên, chúng ta phải tìm hiểu về cơ chế tạo số ngẫu nhiên, những yếu tổ chỉ phối đến quá trình tạo số ngẫu nhiên Trong luận văn này, em sẽ đề cập đến những kiến thức cơ bản của số ngẫu nhiên, ứng dụng của số ngẫu nhiên, các thuật toán sinh số ngẫu nhiên và ứng dụng số ngẫu nhiên trong bài toán đánh số phách theo hai giai đoạn đồn túi và đánh số phách
Trang 10các thuật toán trên ngôn ngữ lập trình C/C++ và cài đặt ứng dụng đánh số phách cho thí sinh dự thi các kỳ thi Cụ thê như sau:
e Nghiên cứu lý thuyết về số ngẫu nhiện và các thuật toán sinh số ngẫu nhiên; © Cài đặt các thuật toán sinh số ngẫu nhiên bằng ngôn ngữ lập trình C/C””; e So sanh cach cài đặt, đánh giá ưu và nhược điểm đối với mỗi thuật toán dựa trên những mẫu cụ thể điển hình và khuyến nghị về các thuật toán tốt cho việc sinh
số ngẫu nhiên trên máy tính;
e Cài đặt ứng dụng đánh số phách cho thí sinh tham dự các kỳ thi
Đề thực hiện được những mục tiêu nói trên, em đã thực hiện luận văn với tên dé tai “Nghiên cứu một số thuật toán tạo số ngdu nhiên và ứng đụng” Luận văn gồm có 03 chương, không kế phần mở đầu và kết luận:
Chương 1: Tổng quan về số ngẫu nhiên
Chương 2: Một số phương pháp tạo số ngẫu nhiên
Trang 11CHUONG 1 TONG QUAN VE SO NGAU NHIEN
1.1 KHAI NIEM VE SO NGAU NHIEN
Trong các hoạt động của cuộc sống, nghiên cứu và học tập, chúng ta bắt gặp rất nhiều tình huống, sự kiện ngẫu nhiên xảy ra ở xung quanh như các hiện tượng thiên nhiên xảy ra tại một thời điểm nào đó: nhiệt độ môi trường, tạp nhiễu nhiệt, bức xạ vũ trụ; các hiện tượng xảy ra trong các sự kiện đời sống như vị trí của con trỏ chuột của máy tính, người trúng thưởng trong các đợt khuyến mãi, Tính ngẫu nhiên của những tình huống, sự kiện này có thể được áp dụng vào trong đời sống xã hội để giải quyết một số vấn để như trong bóng đá: bốc thăm chia bảng các đội bóng, bốc thăm cho phép đội tuyển được chọn phần sân thi đấu, bốc thăm để lựa chọn đội tuyển được giao bóng trước trong một trận dau, .; trong cac su kién khuyến mãi: bốc thăm chọn người trúng thưởng, quay số để chọn người trúng thưởng, .; trong việc tổ chức thi: bốc thăm để phân cán bộ vào phòng thi, bốc thăm để phân công cán bộ gám sát tại các khu vực thị, bốc thăm để chọn cán bộ chấm bài thi, tạo ra các số ngẫu nhiên để đánh số phách cho bài thị,
Có nhiều cách khác nhau để thực hiện tính ngẫu nhiên cho các sự kiện, nếu cần sự ngẫu nhiên cho việc chọn một trong hai lựa chọn, chẳng hạn như chọn phần sân thi đấu, chọn đội tuyển giao bóng trước, người ta có thê sử đụng một đồng xu để thực hiện việc chọn ngẫu nhiên giữa hai mặt; nếu cần sự ngau nhién cho viéc sắp xếp các nhóm, chẳng hạn như chia bảng cho các đội bóng, sắp xếp cán bộ vào phòng thi, người ta có thể sử dụng các mảnh giấy ghi tên bảng đấu/tên phòng thi của đội tuyển/người lên bốc thăm: nếu cần sự ngau nhiên cho việc đánh số của một loạt các đối tượng như đánh số phách bài thi, người ta sử dụng phần mềm máy tính để tạo ra các số phách ứng với số báo danh một cách ngẫu nhiên Bên cạnh đó, phần mềm máy tính có thể ứng dụng vào nhiều công việc khác nhau có mang yếu tố ngẫu nhiên như: như sắp xếp thứ tự các bài hát ở chế độ xáo trộn bằng một ứng dụng nghe nhạc, cho phép các sự kiện trong trò chơi điện tử xảy ra, chọn các số trong tro chơi xổ số may mắn, tạo ra các mật mã để sử dụng cho mục đích bảo mật
Trang 12diện ly thuyết lẫn thực nghiệm và đã đem lại nhiều ứng dụng trong thực tế Khái niệm số ngẫu nhiên được rút ra từ cả hai quá trình nghiên cứu lý thuyết và thực nghiệm
- Khái niệm số ngẫu nhiên theo lý thuyết: Một chuỗi #¡ được gọi là ngẫu nhiên nếu các phần tử của nó bằng với những mẫu #¡ = #;(C) của một biến ngẫu nhiên độc lập phân phối đều (biển ngâm nhiên ở đây có phân phổi đều vì số ngấu nhiên cũng được hiểu theo nghĩa tương tự, tức là xác suất tạo ra một số ngẫu nhiên là nh nhau trong cả chuỗi ngẫu nhiên)
- Khái niệm số ngẫu nhiên theo thực nghiệm: Một chuỗi x; được gọi là ngẫu nhiên nếu các thuộc tính thống kê của nó giống với những thuộc tính của đữ liệu ngâu nhiên thu được từ một thử nghiệm ngẫu nhiên
Các nghiên cứu về lý thuyết và thực nghiệm phải được xem xét sao cho quá trình thực nghiệm thống nhất với lý thuyết đã đặt ra, nghĩa là kết quả thu được từ thực nghiệm phải phù hợp với lý thuyết xác suất và phải thỏa mãn hai yêu cầu: các phép thử phải độc lập và các mẫu thử chỉ được xem như là gần đúng
1.2 LICH SU CUA SO NGAU NHIÊN
Khái niệm về “ngẫu nhiên” đã xuất hiện từ rất lâu trong các nền văn minh của nhân loại Trong lịch sử cổ đại, các khái niệm về cơ hội và tính ngẫu nhiên có liên kết chặt chẽ với số phân Nhiều dân tộc cổ đại ném xúc xắc để xác định số phan va sau này phát triển thành trò chơi may rủi Sau này, đề phá vỡ tính ngẫu nhiên của số phận, nhiều nền văn hố cơ xưa đã sử dụng các phương pháp bói toán khác nhau để cố gắng dự đoán số phận của con người, các sự kiện quan trọng sẽ xảy ra trong tương lại và sự hưng thịnh, suy vong của các quốc gia
Các triết gia Hy Lạp cũng thảo luận về tính ngẫu nhiên của chiều dài, nhưng chỉ ở dạng không định lượng
Trang 13Đầu thế kỷ XX, với sự phát triển của khoa học kỹ thuật, con người đã chứng kiến sự phát triển nhanh chóng trong phân tích hình thức về tính ngẫu nhiên khi các phương pháp tiếp cận khác nhau về cơ sở tính toán xác suất được công bố và chấp nhận rộng rãi trong xã hội Từ giữa thế kỷ XX đến nay, những ý tưởng của bộ môn Ly thuyét théng tin thuat toan (algorithmic information theory) di néu ra nhitng chiều kích mới vào lĩnh vực này thông qua khái niệm ngẫu nhiên thuật toán (algorithmic randomness)
Thuật toán ngẫu nhiên đầu tiên là một phương pháp được phát triển bởi Michael O Rabin cho bài toán cặp gần nhất trong hình học tính toán Nghiên cứu về các thuật toán ngẫu nhiên được thúc day bởi một phát hiện của Robert M Solovay và Volker Strassen vào năm 1977[5] về một thử nghiệm nguyên thủy ngẫu nhiên (nghĩa là xác định tính nguyên thủy của một số) Ngay sau đó, Michael O Rabin đã chứng minh rằng, bài kiểm tra tính nguyên thủy ngẫu nhiên do Robert M Solovay và Volker Strassen để xuất có thể biến thành một thuật toán ngẫu nhiên Trước thời điểm đó, không tổn tại một thuật toán nào đề xác định tính nguyên thủy
1.3 PHAN LOAI SO NGAU NHIÊN
1.3.1 Các đặc điểm của số ngẫu nhiên
Với sự ra đời của máy tính, các lập trình viên nhận ra sự cần thiết của một phương tiện để đưa sự ngẫu nhiên vào một chương trình máy tính Tuy nhiên, dé có được một loại máy tính sinh ra các sự kiện một cách tỉnh cờ, ngẫu nhiên là vô cùng khó khăn Bởi vì hiện nay, các máy tính đều là tất định và máy tính thực hiện công việc thông qua các thuật toán theo những hướng dẫn cho trước và do đó chúng ta hoàn tồn có thể dự đốn được những sự kiện sẽ xảy ra nếu nắm được thuật toán Có hai cách tiếp cận chính để tạo ra các số ngẫu nhiên gồm số giả ngẫu nhiên và số ngẫu nhiên thực sự bằng cách sử dụng máy tính thông qua các bộ tạo số giả ngẫu nhiên và bộ tạo số ngau nhiên thực sự Cụ thể:
Trang 14thời gian hiện tai trong may tinh, Cac nguén sé liéu nay dé bi thao túng cho nên cách thực hiện này sẽ tao ra các số không hoàn toàn là ngẫu nhiên Để tạo ra các số ngẫu nhiên khó bị thao túng hơn, một số PRNG sử dụng nguồn số liệu phức tạp hơn như: tạp nhiễu nhiệt, bức xạ vũ trụ, Nếu chọn giá trị ban đầu đủ tốt và dãy có chu kỳ lặp lại đủ lớn, chúng ta gần như không thể phân biệt giữa dãy giả ngẫu và dãy ngẫu nhiên thực sự Các PRNG này phải cần đến các thiết bị phức tạp hơn, điều đó đồng nghĩa với giá thành của các PRNG này cao hơn Tuy nhiên, việc sử dụng các PRNG có thể đem lại một số rủi ro nhất định Thứ nhất, nếu chọn giá trị ban đầu không tốt sẽ dẫn đến nhiều sai khác đáng kế như chu kỳ lặp lại bị giảm Thứ hai, sử dụng thuật tốn tạo số khơng đủ tốt cũng sẽ có kết quả khơng như mong muốn Ngồi ra một dãy giả ngẫu nhiên sẽ có sự phân bố các số không đồng đều, tức là có những số dễ xuất hiện hơn số khác, nên không thể dùng làm số liệu cho nghiên cứu, thống kê
- Bộ tạo số ngẫu nhiên thực sự (true random number generator, viét tat la TRNG): Các TRNG thường được xây dựng một cách rất đặc biệt bằng các sử dụng các hiện tượng vật lý mang tính ngẫu nhiên đã được kiểm soát, đo lường và chứng minh về tính ngẫu nhiên do các hiện tượng đó sinh ra Các TRNG thường phải mắt một thời gian tương đối lâu dé tạo ra các số ngẫu nhiên Vì vậy, việc sử dụng các TRNG để tạo ra một số lượng lớn các số ngẫu nhiên phục vụ cho các thực nghiệm đòi hỏi về mặt thời gian, nhất là các thực nghiệm theo thời gian thực sẽ không khả thi
Các phương pháp tiếp cận có đặc điểm khá khác nhau và từng có những ưu và khuyết điểm của riêng nó Vì vậy, việc sử dụng PRNG hay TRNG cần phải xem xét tính chất công việc ấy Thực chất, máy tính không thể tạo ra các số ngẫu nhiên thực sự Chúng chỉ có thể tạo ra các số giả ngau nhiên dựa trên một thuật toán được lập trình Tuy không thể tự tạo ra được số ngẫu nhiên, máy tính vẫn có thể đo lường các sự kiện vật lý ngẫu nhiên, từ đó gián tiếp tạo ra các số ngẫu nhiên thật sự Do vậy, một trong những cách cải thiện hiệu quả của PRNG là phát triển
thuật toán tốt hơn
Trang 15biến động ở cấp độ vi mô (ví đụ, sự chuyển động của hạt quark, sự phân rã phóng xạ hạt nhân hay tiếng n của nguyên tử, ) xây ra một cách ngẫu nhiên
1.3.2 Số giả ngẫu nhiên
Số giả ngẫu nhiên do máy tính tạo ra bằng thuật toán Thông thường, người ta thường xây dựng các bộ tạo số giả ngẫu nhiên với các thuật tốn sử dụng cơng thức toán học hoặc bảng tính cho trước để tạo ra trình tự các con số ngau nhién Hién nay có rất nhiều nghiên cứu về việc tạo ra các số giả ngẫu nhiên đã được tiến hành trong nhiều năm qua, và các thuật toán hiện đại ngày nay đã có thể tạo ra các số giả ngẫu nhiên tốt đến mức chúng gần như các số ngẫu nhiên thật
Đặc điểm của số giả ngẫu nhiên là có tính chu kỳ, có nghĩa là các chuỗi số ngẫu nhiên giả sẽ lặp lại sau một số hữu hạn con số nào đó Chúng ta thấy rằng, sự tuần hoàn của dãy số không phải là một đặc tính mong muốn khi tạo ra số ngẫu nhiên Vì vậy, các thuật toán tạo số giả ngẫu nhiên được thiết kế có độ dài của tính tuần hoàn lớn đến nỗi nó có thể được bỏ qua trong hầu hết các ứng dụng Việc số giả ngẫu nhiên có tốt hay không còn phụ thuộc vào nhu cầu của mỗi ứng dụng Nếu đang chơi một trò chơi điện tử, dù các sự kiện trong trò chơi đó được thiết lập theo hình thức ngẫu nhiên thật hay theo hình thức giả ngẫu nhiên thì điều đó hồn tồn khơng quan trọng Tuy nhiên, nếu đang cần mã hóa cho mục đích bảo mật, các ứng dụng sẽ không sử dụng các hình thức giả ngẫu nhiên, bởi vì điểm này dễ bị tin tặc dự đoán được và tấn công hệ thống
1.3.3 Số ngẫu nhiên thật sự
Số ngau nhiên thật sự do máy tính do lường các sự kiện, hiện tượng ngẫu nhiên xây ra bên ngồi mơi trường máy tính Số ngẫu nhiên thật được tạo ra bởi bộ tạo số ngau nhiên thực sự So với việc tạo số giả ngau nhiên, việc tạo số ngau nhién thực sự trích xuất giá trị của các đại lượng từ các sự kiện, hiện tượng ngẫu nhiên ở môi trường và đưa nó vào máy tính
Trang 16hồn tồn khơng thể đoán trước và chúng có thể được phát hiện và đưa vào máy tính một cách dễ dàng đồng thời còn tránh được các cơ chế lưu lại trong bộ đệm của hệ điều hành Một trong những dịch vụ tạo ra số ngau nhiên thực su là HotBits của Fourmilab 6 Thuy Si Nó là một dịch vụ trên Internet dùng để tạo ra các số ngau nhiên thực sự thông qua một quá trình được điều chỉnh bởi tính không chắc chắn trong các quy luật cơ học lượng tử HotBits sử dụng các cặp phân rã phóng xạ liên tiếp được phát hiện bởi đường ống Geiger-Mũller kết nối với máy tính
Nói chung các số ngẫu nhiên thật cũng không phải là hoàn toàn ngẫu nhiên theo ý nghĩa thật nhất của bản chất van dé Bởi vì máy tạo số ngẫu nhiên thật sự chỉ thu thập sự ngẫu nhiên từ môi trường, sau đó vẫn phải xử lý lại bằng thuật toán đo chúng ta mong muốn các số ngẫu nhiên phải tuân theo một số tiêu chuẩn nhất định 1.3.4 So sánh số giả ngẫu nhiên và số ngẫu nhiên thật sự
Mặc dầu đều là những số ngẫu nhiên, nhưng số giả ngẫu nhiên và số ngẫu nhiên thực sự có những đặc điểm khác nhau nhất định Bang 1.1 chi ra một số điểm khác biệt giữa số giả ngẫu nhiên và số ngẫu nhiên thực sự
Bảng 1.1 Sự khác nhau giữa số giả ngâu nhiên và số ngẫu nhiên thực sự
Đặc điểm Số giả ngẫu nhiên Số ngẫu nhiên thực
Độ tạo số PRNG (pseudorandom number TRNG (true random number
generator) generator)
Hiệu quả kinh tế | Xuất sắc Kém
Tính xác định Xác định Không xác định
Tính chu kỳ Co chu ky Không có ky
Cơ chế Sử dụng thuật toán cho trước Đo lường hiện tượng vật lý
Ứng dụng Mô phỏng và mô hình hóa, trò Xổ số, cờ bạc, lấy mẫu ngẫu
chơi điện tử, nhiên, an ninh, mã hóa đữ liệu,
Trang 17
1.4 UNG DUNG CUA SO NGAU NHIEN
Mac du sé giả ngẫu nhiên ứng dụng hạn hẹp hơn số ngẫu nhiên thực sự nhưng người ta vẫn sử dụng các số giả ngẫu nhiên vì nó có lợi thé hon so với các số ngẫu nhiên thực sự Thứ nhất, chúng ta có thể tạo ra một số lượng lớn các số giả ngau nhiên trong thời gian tương đối ngắn, chỉ phí thấp thông qua các PRNG, chúng ta phải mất thời gian tương đối lâu, chi phí cao dé tao ra số ngẫu nhiên thực sự thông qua các TRNG Với những lợi thế về tốc độ và chi phí, hiện nay người ta vẫn sử dụng các số giả ngẫu nhiên trong rất nhiều ứng dụng
1.4.1 Ứng dụng trong mô phỏng
Nhiều mô hình giả lập được tạo ra một phan nhờ các bộ tạo số giả ngau nhién vì chúng có thể tạo ra lượng dữ liệu ngẫu nhiên lớn, tương đối tốt và tốn ít chi phi hơn so với việc dùng bộ tạo số ngẫu nhiên thực sự Trong hàng không, đặc biệt là hàng không vũ trụ, các mô phỏng điều kiện thời tiết (đừng trong các thiết bị mô phỏng điêu kiện bay hay các kế hoạch đáp vệ tỉnh lên sao Hỏa của NAS4) thường dùng các PRNG để tạo ra các số ngẫu nhiên do lượng đữ liệu ngẫu nhiên cần sử dụng quá lớn và thời gian cần số ngẫu nhiên quá nhanh, tương đương với thời gian thực Đối với các kỹ sư kiểm thủ hệ thống, chẳng hạn như kiểm tra một cây cầu xây có đảm bảo chất lượng hay không, hoặc một mẫu xe mới thiết kế có tiết kiệm nhiên liệu hay không, đa số đều sử mô phỏng trên máy tính để tiết kiệm chi phi bởi vi chỉ phí thử nghiệm thực tế cho những công việc này rất tốn kém
1.4.2 Ứng dụng trong trò chơi điện tử
Nhiều yếu tố trong trò chơi điện tử thường dựa vào các số giả ngẫu nhiên được sinh ra bởi các PRNG Với các trò chơi điện tử đơn gian nhu Solitaire, Minesweeper (của hệ điều hành Jindows) thì đó là việc chia bài, sắp xếp các ô có mìn một cách ngẫu nhiên Còn trong các trò chơi điện tử có lập trình phức tạp hơn như League of Legend (Liên Minh Huyền Thoại là một trò chơi video đấu trường trận chiến trực tuyến nhiều người chơi được Riot Games phát triển và phát hành đa nên tang: PlayStation 3, Xbox 360, PlayStation 4, Xbox One, Android, iOS), Bloodborne (1à một trò chơi nhập vai hành động được phát triển bởi FromSofhvare và được Sony Computer Entertainment phát hành cho PlaySfation 2), số giả ngẫu
Trang 18nhiên góp phần quyết định các hành động của các nhân vật và các sự kiện do máy tính điều khiến
1.4.3 Ứng dụng trong mã hóa thông tin
Trong các thuật toán mã mã hóa thông tin, nhiều thuật toán sử dụng các số ngẫu nhiên để mã hóa và giải mã thông tin Chẳng hạn như, thuật toán mã hóa khóa RSA, Diffiel-Hellman, DES, 3DES, AES, Ví dụ, thuật toán mã hóa RSA (dat theo tén cua ba nha khoa hoc phat minh ra no la Ron Rivest, Adi Shamir va Leonard Adleman) là một trong những hệ thống mã hoá bất đối xứng được sử dụng rộng rãi nhất hiện nay, có ý tưởng then chốt để đảm bảo tính an toàn là dựa trên sự khó khăn trong việc phân tích nhân tử của hai số nguyên tố lớn Từ p và q cho trước, để tính tích p X q = m sẽ được thực hiện một cách dé dàng, nhưng việc tìm ngược lai p,q tu n la m6t bai toán phân tích nhân tử có độ phức tạp rất lớn
Tính an toàn của thuật toán RSA chủ yếu dựa vào việc sinh ra hai số nguyên tố ngẫu nhiên p và q ban đầu có giá trị rất lớn để tính tích p X q = n Việc tính tích hai số p và q để được nn rất đơn giản, nhưng việc tính ngược lại giá trị p và q từ n cho trước là rất khó, hầu như không thê khi hai số nguyên tố p và q có độ lớn từ 2048 bít trở lên Do đó nếu như một bên nào đó đoán ra được hoặc tìm ra lỗ hồng của bộ tạo số ngẫu nhiên trong quá trình tạo số nguyên tố ngẫu nhiên thì việc mã hóa thông tin bằng thuật toán RSA xem như dễ dàng bị giải mã
1.4.4 Các ứng dụng khác
Số giả ngẫu nhiên còn có thể được dùng cho một số việc khác như in các câu danh ngôn lên từng ngày của các cuốn lịch treo tường, sắp xếp các bài hát ở chế độ xáo trộn bằng một ứng dụng nghe nhạc, sinh ra các dãy số trong các chương trình xổ số điện toán, các ứng dụng dự đoán trên facebook Bên cạnh đó nó cũng có thê được ứng dụng cho việc nhập dữ liệu để kiểm thử chương trình để tránh mất thời gian và giảm căng thắng cho người nhập liệu Trong luận văn này, em còn sử dụng số ngẫu nhiên trong quá trình dồng túi và đánh số phách cho bài thị
Trang 191.5 HAM TAO SO NGAU NHIEN TRONG MOT SO NGON NGU LAP TRINH 1.5.1 Tạo số ngẫu nhiên trong ngôn ngữ C/C++
Trong ngôn ngữ lập trình C/C++, người ta sử dụng hàm rand() để tạo số ngẫu nhiên Hàm randi() trả về một số nguyên có kiểu dữ liệu là int Tuy nhién, hàm rand() trong ngôn ngữ lập trình C/C++ có đặc điểm là sẽ không tạo ra số ngẫu nhiên mới khi ta thực thi chương trình ở các lần tiếp theo Nghĩa là, kết quả sinh ra số ngẫu nhiên của chương trình những lần thực thi khác nhau đều là các số giống nhau Để tạo ra các số ngẫu nhiên khác nhau ở những thời điểm chạy chương trình khác nhau, chúng †a có thể sử dụng một trong số các hàm sau:
a Tạo số ngẫu nhiên với hàm srandl()
Để tạo ra các số ngẫu nhiên khác nhau vào những thời điểm thực thi chương trình khác nhau, chúng ta cần thêm hàm srand() vào chương trình và truyền vào cho hàm này một tham số seed kiểu dữ liệu 1a int, cung cấp là một giá trị nhân cho bộ tạo số giả ngẫu nhiên được sử đụng bởi hàm rand() Tham sé seed thay
đổi thì hàm srand() sẽ khởi †ạo ra các số ngau nhiên khác nhau Nếu chúng ta truyền giá trị 123 cho hàm srandi(), nghĩa là srand(123) thì những lần thực thi
chương trình khác nhau sẽ nhận được số ngẫu nhiên giống nhau do seed=123 là một hằng số Do vậy, chúng ta cần truyền vào một giá trị động chứ không phải giá trị tĩnh Giải pháp thường sử dụng ở đây là truyền cho seed có giá trị là thời gian
hiện tại thông qua hàm time () trong thư viện time.h Hàm time() tra về kiểu
time t nhưng chúng ta hoàn toàn có thể chuyên về kiểu dữ liệu int
Trang 20for(int i=0O; i<xn; ++i) { r = rand(); printf("So ngau nhien thu %d la d\n", i, r); }
b Tạo số ngẫu nhiên trong một đoạn cho trước
Từ tính chất số dư của phép chia đư một số nguyên bất kỳ a cho một số nguyên b cố định sẽ có giá trị thuộc [0,b — 1], nghĩa là mm = œ% b suy ra mm € [0,b — 1] Sử dụng tính chất này, chúng ta sẽ sinh ra số ngẫu nhiên trong một đoạn cho trước [min,max] bằng cách cộng giá trị mín với số dư của số ngẫu nhiên r duoc sinh ra chia cho gia tri max + 1 — min
Mã nguồn 1.2 Chương trình tạo số ngẫu nhiên trong một đoạn cho trước #include <stdio.h> #include <stdlib.h> #include <time.h> const int n=10; int random(int min, int max) { return mintrand()%(max+1l-min) ; int main() { srand((int)time(0)); dae ay for(int i=O; i<xn; ++i) { r=random(10,300); printf("So ngau nhien thu %d la d\n", i, r); }
1.5.2 Tạo số ngẫu nhiên trong ngôn ngữ Java
Để tạo một số ngẫu nhiên trong ngôn ngữ lập trình Java, chúng ta có thể sử dụng lớp java.uti1 Random đã được hợp sẵn trong JDK Java cung cấp nhiều cách thức tao số ngẫu nhiên khác nhau Tắt cả các cách thức tạo số ngẫu nhiên đều bắt đầu bởi việc khởi tạo một bộ tạo số ngau nhién Random generator = new Random() Tuong tu nhu C/C++, Java cũng sử dụng một tham số seed khi phát
Trang 21sinh mot thé hién cho lớp Random để tạo ra sự khác biệt khi tạo số ngẫu nhiên bằng cách thay đổi giá trị tham số seed này Có nhiều phương thức của Random, cụ thể như sau:
- nextTnt (): trả về một số ngau nhién o6 kiéu dé liéu 1a int voi giá trị nằm trong phạm vi [—21, 231 — 1]
- nextInt (maxNumber): tra vé một số ngau nhiên có kiểu dữ liệu la int
với gid tri nam trong pham vi [0, maxNumber)
- nextLong(): trả về một số ngau nhiên có kiểu dữ liệu là 1ong, nhưng không thê trả về tất cả các giá trị thuộc kiểu 1ong vì Random sử đụng giá trị seed chi 48 bit
- nextFloat(): trả về một số ngẫu nhiên có kiểu dữ liệu là số thực trong pham vi [0.0, 1.0)
- nextDouble(): tương tự như phương thức nextFloat() nhưng độ dài
phan thập phân lớn hơn
- neztBoolean (): trả về gia tri true, false ngau nhién
Mé nguén 1.3 Phwong thirc next Int () tra vé mét sé ngdu nhién co kiéu int
public static void main(String[] args) { Random rd = new Random();
//khai báo 1 đối tượng Random
int numl = rd.nextInt();
//trả về 1 số nguyên bất ky
System.out.println("Số vừa được sinh ra là " + num1);
int num2 = rd.nextInt (4); //trả về số nguyên trong phạm vi [0 3] System.out.println("Số vừa được sinh ra là " + num2); //trả về 1 số nguyên nằm trong phạm vi [-4 —1 //đỗi với rd.nextInt(4) thì số lớn nhất là 3 và số nhỏ nhất là 0 //ta có 3 - 4 = -1 và 0 - 4 = -4
//nên các số được sinh ra sẽ nằm trong đoạn [-4 -1]
int num3 = -4 + rd.nextInt (4);
"
System.out.println("Số vừa được sinh ra là + num3);
Trang 22
MG nguén 1.4 Phwong thite nextFloat() trả về một số ngâu nhiên cé kiéu float nam trong pham vi [0.0, 1.0)
public static void main(String[] args) { Random rd = new Random();
//khai báo 1 đối tượng Random
float floatNumber = rd.nextFloat();
//trả về 1 số bắt kỳ có kiểu 1A float
System.out.println("Số vừa được sinh ra là " + floatNumber) ;
Mã nguồn 1.5 Phương thức nextDouble() trả về một số ngấu nhiên có kiểu doub1e nằm trong phạm vi [0.0, 1.0)
public static void main(String[] args) { Random rd = new Random();
//khai báo 1 đối tượng Random
double doubleNumber = rd.nextDouble(); //trả về 1 số bắt kỳ có kiểu 1A double System.out.println("Số vừa được sinh ra là " + doubleNumber) ; Mã nguồn 1.6 Phương thức nextLong () trả về một số ngâu nhiên có kiểu 1ong
public static void main(String[] args) { Random rd = new Random();
//khai báo 1 đối tượng Random
long longNumber = rd.nextLong ()¿
//trả về 1 số bắt kỳ có kiểu long
System.out.println("Số vừa được sinh ra là " + longNumber);
Mã nguồn 1.7 Phương thức nextBoolean() trả về một biển ngâu nhiên
cé gid trila true hodc false
public static void main(String[] args) { Random rd = new Random();
//khai báo 1 đối tượng Random
boolean bool = rd.nextBoolean();
//trả về 1 biến bool có giá trị là true hoặc false
System.out.println("Giá trị của biến bool là " + bool);
15
Trang 23
1.5.3 Tạo số ngẫu nhiên trong ngôn ngữ Python
Ngôn ngữ lập trình Python tạo số ngẫu nhiên thông qua hàm random() trong module có cùng tên là random
a Tạo ra một số ngẫu nhiên
- Lấy một số ngẫu nhiên trong khoảng (0,1)
Mã nguồn 1.8 Chương trình tạo ra một số ngâu nhiên trong khoảng (0,1) import random print (“Random: %f” % random random () )
- Lấy một số ngẫu nhiên trong khoảng nào đó, ta sử dụng hàm randint () Mã nguồn 1.9 Chương trình tạo ra một số ngâu nhiên trong khoảng bắt kì import random print (“Random: %f” % random randint (1,100) )
- Lấy một số ngẫu nhiên trong khoảng nào đó sử đụng hàm uniform() Mã nguồn 1.10 Chương trình tạo ra một số ngẫu nhiên trong khoảng bất kì import random print("Random float 1 100: %f" % random uniform(1, 100))
b Chọn một phần tử ngẫu nhiên từ một dãy không rỗng
Dé chon mét phan tử ngẫu nhiên từ một đấy số không rỗng, ta có thể sử đụng
hàm choi ce (seq) Hàm choi ce (seq) cho phép ta chọn một số từ bất kỳ dãy số
nào ta muốn Một lợi thế khác của hàm này là nó không giới hạn ở chỉ các con số Nó có thể chọn bất kỳ loại phần tử ngẫu nhiên nào từ một dãy Chẳng hạn như, tên của người thắng trong cuộc thi rút thăm may mắn giữa 5 người khác nhau, được cung cấp đưới dang chuỗi, có thể được xác định bang ham nay mot cach dé dang
Nếu muốn xáo trộn một dãy thay vì chọn một phan tử ngẫu nhiên từ nó, ta có thể sử dụng hàm shuffle(seq) Việc này sẽ dẫn đến một sự xáo trộn dãy số thích hợp Đối với một dãy có chỉ có 10(n) phần tử, có thể có tổng cộng 3628800(n!) chỉnh hợp khác nhau Với một dãy lớn hơn, số hoán vị có thể sẽ
16
Trang 24
cao hơn, điều này hàm ý rằng hàm này có thể không bao giờ tạo ra tất cả các hoán vị của một dãy lớn
Giả sử phải chọn 50 sinh viên từ 100 nhóm sinh viên để đi du lịch Tại thời điểm này, ta có thể tạm thời sử dụng hàm choice (sea) Vấn đề là sẽ phải gọi nó khoảng 50 lần trong trường hợp tốt nhất, nơi nó không chọn hai lần cùng một sinh viên Một giải pháp tốt hơn là sử dụng hàm sample (seq,1) Nó sẽ trả về một danh sách các phần đuy nhất k từ dãy đã cho Dãy ban đầu không thay đổi Các phan tử trong danh sách kết quả sẽ theo thứ tự lựa chọn Nếu k lớn hơn số lượng các phân tử trong dãy, một giá trị va1ueError sẽ được sinh ra
Mã nguồn 1.11 Chương trình chọn một phần tử ngẫu nhiên từ một đấy không rỗng import random ids = [1, 8, 10, 12, 15, 17, 25] random.choice(ids) #returns 8 random.choice(ids) #returns 15 names = ['Tom', 'Harry', 'Andrew', 'Robert'] random.choice (names) #returns Tom random choice (names) #returns Robert random shuffle (names) names #returns ['Robert', 'Andrew', 'Tom', 'Harry'] random.sample(names, 2) #returns ['Andrew', 'Robert'] random.sample(names, 2) #returns ['Tom', 'Robert"] names #returns ['Robert', 'Andrew', 'Tom', 'Harry']
1.6 TIEU KET CHUONG 1
Trong Chương này, em đã khái quát lại một số khái niệm cơ bản về số ngẫu nhiên, lịch sử nghiên cứu về số ngau nhiên Trên cơ sở những tính chất, đặc điểm của sô ngâu nhiên, em đã phân loại sô ngâu nhiên thành sô giả ngâu nhiên và sô
Trang 25ngau nhiên thực sự Với ưu điểm của số giả ngau nhiên là việc tạo ra nó chiếm ít thời gian, chỉ phí thấp nên số giả ngẫu nhiên được ứng dụng nhiều trong các trò chơi điện tử, mô phỏng hệ thống: với ưu điểm của số ngau nhiên thực sự là tính khó đoán nên được ứng dụng nhiều trong các hệ mã hóa thông tin Trong Chương này, em cũng trình bày những cách thức và các hàm tạo số ngẫu nhiên trong các ngôn ngữ lập trình khác nhau để minh họa thêm cho quá trình tạo số ngẫu nhiên bằng máy tính điện tử
Trang 26CHUONG 2 MOT SO PHUONG PHAP TAO SO NGAU NHIEN
2.1 GIỚI THIỆU
Phương pháp cổ điển sinh ra các số giả ngẫu nhiên bao gồm: phương pháp vật lý như rút thăm (casfing loi), gieo xúc xắc (0hrowing đice), rút các quan bai (dealing out cards), lay ngau nhién céc qua cầu được đánh số từ một hộp kín (đ'awing numbereed ball from “well stirred urn”), x6 số (lofferies); phương pháp cơ học như sử dung dia xoay (spinning disk), sit dung mach dién tử trên cơ sở phóng điện ngẫu nhiên trong môi trường chân không, sử dụng các số chữ số sau dấu phẩy của số Tr, Tuy nhiên, người sử dụng thường gặp khó khăn khi sử dụng các phương pháp cổ điển ở trên do các nguyên nhân sau:
e Nhiều phương pháp không thể tạo ra các số ngẫu nhiên như đã có; e Máy tính (zếu có) phải sử dụng bộ nhớ rất lớn dé sinh số ngẫu nhiên;
e Không đủ con số ngẫu nhiên theo yêu cầu của nhiệm vụ sinh số ngẫu nhiên Chính vì vậy, ngoài những phương pháp cô điển sinh ra các số giả ngẫu nhiên như gieo đồng tiền, gieo xúc xắc thì các phương pháp tạo số giả ngẫu nhiên trên máy tính thông qua các thuật toán tạo số ngẫu nhiên theo phân phối xác suất được ưu tiên sử dụng cho các nhiệm vụ có tính ngau nhién
2.2 HAM PHAN PHOI XAC SUAT
2.2.1 Khái niệm biến ngẫu nhiên
Trong phần này, chúng ta sẽ giới thiệu tóm tắt lại một số khái niệm liên quan đến biến ngẫu nhiên
e Xét một phép thử trong không gian mẫu O Hàm X được xác định X:o0>I
œ > X(6) được gọi là biến ngẫu nhiên
Trang 27e© Miền giá trị của hàm X kí hiệu là Im(X)
Im(Œ) = {x € R: 3ø € 0,X(@) = x} với a € Im(X), tap {w: X(w) = a} la mot sy kiện ngẫu nhiên
e Biến ngẫu nhiên X là liên tuc néu Im(X) la mot khoang hay doan sé thuc, và là tập vô hạn không đếm được Biến ngẫu nhiên X là rời rac néu Im(x) là tập hữu hạn hay vô hạn đếm được
Ví dụ 2.1 Xét phép thử Bernoulli, trong phép thử này chỉ có hai kết quả “thành công”, ký hiệu là 7 và “thất bại”, ký hiệu là T
Chúng ta xác định một quy tắc X như sau: X(T) = 1,X(T) = 0, khi đó X là một biến ngẫu nhiên và Irn(Y) = {0, 1} Giả sử xác suất thành công là P(T) = q và xác suất thất bại là P(T) = 1 — q Lúc đó ta có:
P(X = 1) = P({w:X(w) = 1}) = PŒT) = q Tuong tu nhu thé P(X = 0) =1—4q
2.2.2 Luật phân phối xác suất của biến ngẫu nhiên
Quy luật phân phối xác suất của biến ngẫu nhiên là cách biểu diễn mối quan hệ giữa giá trị có thể có của biến ngẫu nhiên và các xác suất tương ứng để biến ngẫu nhiên nhận các giá trị đó Đề mô tả quy luật phân phối xác suất của biến ngẫu nhiên người ta thường sử dụng các phương pháp phổ biến sau:
e Bảng phân phối xác suất (được áp dụng cho biến ngẫu nhiên rời rac); e Hàm mật độ xác suất (được áp dụng cho biến ngẫu nhiên liên tục);
e Hàm phân phối xác suất (được áp đụng cho cả hai loại biến ngẫu nhiên rời rạc và biên ngâầu nhiên liên liên tục)
2.2.3 Hàm mật độ xác suất của biến ngẫu nhiên
Cho biến ngau nhién X lién luc va hai gia tri thuc a < b, xac suất của sự kiện
{a<X <b} là P(a< X<b) Một hàm ƒ không âm, thỏa P(a< X<b)=
ƒ}ƒ()dx được gọi là hàm mật độ xác suất của biến ngẫu nhiên X Hàm mật độ xác suất ƒ thỏa mãn đồng thời các điều kiện sau:
Trang 28e f(x) 20, Vx ER; ° ƒƒ)dx =i
2.2.4 Hàm phân phối xác suất của biến ngẫu nhiên
Cho biến ngẫu nhiên X Với mỗi số thực +, xác định duy nhất một biến cố (X < #) và do đó có tương ứng một và chỉ một xác suất P(X < x) Quan hệ tương ứng này cho ta một hàm số xác định trên IR và được ký hiệu là F(x)
Hàm sé F(x) = P(X < x),x € IR, được gọi là hàm phân phối (hàm phân bố) xác suất của biến ngẫu nhiên X
e Khi X là một biến ngẫu nhiên roi rac thi F(x) = Yee f(t)
e Khi X là một biến ngẫu nhiên liên tục thì F(x) = f*, f (Ode
Hàm phân phối xác suất của một biến ngẫu nhiên có một số tính cơ bản sau: © O< F(X) <1,vVx ER e F(x) < F(%Q), Vx4, x2 € R, xy < x2 e P(a<X<b)=F(b)— F(a),Va,b €TR e lim F(x)=0 x>-œ e lim F(x)=1 x>+œ
© f(x) = F'(x) tại x là điểm liên tục của ƒ
2.3 MỘT SỐ THUẬT TOÁN TẠO SỐ NGẪU NHIÊN
Hiện nay, có nhiều thuật toán dé sinh số ngẫu nhiên khác nhau bằng máy tính điênh tử Tuy nhiên, các thuật toán liên quan đến số ngẫu nhiên thường sử dụng một số yếu tố chung như sau:
e Gia tri ban đầu (seed): Giá trị ban đầu là một hoặc một vài giá trị được nhập vào trước đùng để kiến tạo dãy các số ngẫu nhiên Các số sinh ra trong day ngẫu nhiên đó phụ thuộc vào thuật toán và giá trị ban đầu này Giá trị ban đầu do chúng ta chọn để đưa vào thuật toán Do đó đề sinh ra các số ngẫu nhiên sau này được khách quan, chúng ta nên chọn một số ngẫu nhiên cho giá trị ban đầu này
Trang 29e Chu kỳ lặp lại (period): Chúng ta biết rằng, số giả ngẫu nhiên được sinh ra theo một công thức xác định nên sau khi một lượng số nhất định được tạo ra, quy luật các số tạo ra tiếp theo sẽ bị lặp lại Ta gọi số số sinh ra trước khi quy luật dãy bị lặp lại là chu kỳ của dãy số đó
2.3.1 Phương pháp chung
Một chương trình sinh số giả ngẫu nhiên được xác định bởi cấu trúc bộ năm (S, P, f, U, g), trong do:
e Sla tap hop các trạng thái;
¢ P 1a mét phan phéi xdc suất trên S, gọi là phân phối ban đầu; © f:S — S la mét ham chuyén; ® U là một tập hữu hạn các dữ liệu xuất, e ø:Š —> U là một hàm dữ liệu xuat; Với cấu truc bộ năm được cho như trên, thuật toán tạo số ngẫu nhiên được xác định như sau: e Sinh ra trạng thái ban đầu (seed), gọi là nhân sọ, tương ứng với # và tính Ug = (So): e Lap lai voi i = 1,2, voi s; = f(s;-1) va uz = g(S;) Nhan xét:
e Nhan sp duoc xac dinh dé lam gia tri chốt, sao cho các lần sử dụng thuật toán với cùng nhân sẽ có kết quả giống nhau
e Các giá trị ngau nhién Up, Uz, duoc xem là các bién ngau nhiên độc lập, cùng phân phối đều
e Chu kỳ của một chương trình tạo ra số giả ngẫu nhiên là số nguyên bé nhất p EN sao cho Vn EN, Spin = s„ Đây là một trong những đặc trưng cơ bản của sé giả ngẫu nhiên, tức là tính lặp sau sau một chu kỳ nhất định
Trang 302.3.2 Phương pháp bình phương giữa
Phương pháp bình phương giữa (m4 sguare mefhođ) là một trong những phương pháp đầu tiên được sử dụng để tạo ra số giả ngẫu nhiên đo John von Neuman và Metropolis đề xuất vào năm 1946 [6] Mặc dù phương pháp này không phải là phương pháp tốt nhất trong thực tế, nhưng nó đã đóng vai trò quan trọng buổi ban đầu khi các phương pháp tạo số ngẫu nhiên chưa phát triển
Đề có cái nhìn ban đầu một cách đơn giản với phương pháp bình phương giữa, chúng ta xem xét tạo số ngẫu nhiên gồm có 4 chữ số (các chữ số đầu có thể có giá trị bằng 0) Gọi giá trị ban đầu là xạ, số tiếp theo trong dãy sẽ thu được bằng cách thực hiện như sau: lấy xạ bình phương tạo ra một số x có 8 chữ số (nếu không đủ 8 chit số thì thêm các chữ số 0 vào phía trước cho đến khi đủ 8 chữ số), sau đó lẫy 4 chữ số ở giữa số x và xem nó là số được tạo ra tiếp theo, gọi là x¡ Với số x, ta lai thực hiện tương tự như trên để có được số ngau nhiên #; và cu tiếp tục như vậy để có được dãy số ngẫu nhiên
Ví dụ 2.2 Tạo số ngẫu nhiên với xạ = 7182
e Đặt s bằng bình phương của + ta được: s = xổ = 71822 = 51581124 Lấy 4 chữ số giữa của s để thiết lập giá trị cho x, ta duge x, = 5811
e Đặt x bằng bình phương của x¡ ta được: s = x‡ = 5811? = 33767721 Lấy 4 chữ số giữa của s đề thiết lập giá trị cho x, ta được xạ = 7677
a Phát biểu thuật toán
Thuật toán bình phương giữa được mô tả sau đây dùng để sinh ra Ì số ngẫu nhiên có giá trị thuộc khoảng (0, 1) với giá trị khởi đầu là n có k chữ số
Thuật toán 2.1 Thuật toán bình phương giữa đề sinh ra dãy số ngâu nhiên
Trang 31
s=x[i ae ]*xlil; (len (s)<2*k) Thêm số 0 vào đầu của s cho đến khi đủ 2*k chữ số; i=itl; Đặt x[i] bằng k chữ số giữa của s; } for (i=0; i<l; i++) x[i]=x[i]/10*; Xuất x[0], x[1], x[l-1] ra màn hình
Lúc đó dãy số thu được #ạ,#¡, ,⁄¡_¡ là dãy các số giả ngẫu nhiên có phân phối đều trong khoảng (0, 1)
Trang 32Tinh x[14]:s = x[13]? = 39482 = 15586704; x[14] = 5867: Tinh x[15]: s = x[14]? = 58672 = 34421689: x[15] = 4216: Tính x[16]: s = x[15]? = 42162 = 17774656; x[16] = 7746: Tính x[17]: s = x[16]? = 77462 = 60000516; x[17] = 0005; e Tinh x[18]:s = x[17]? = 00052 = 00000025; x[18] = 0000;
Ta dừng thuật toán khi đủ số lượng cần sinh hoặc khi nhận được giá trị 0000, tức là dừng lại ở số x[18] Nhân các kết quả với 10 ta được các số giả ngẫu nhiên thuộc khoảng (0,1): 0.4516, 0.3942, 0.5393, 0.0844, 0.7123, 0.7371, 0.3316, 0.9958, 0.1617, 0.1468, 0.5502, 0.2720, 0.3948, 0.5867, 0.4216, 0.7746, 0.0005 Nhận xét:
e Dãy số chúng ta nhận được không hoàn toàn là “ngẫu nhiên” do phụ thuộc
vào sô khởi tạo ban dau xo;
e Dãy số này được gọi là dãy số giả ngẫu nhiên được sinh bởi phương pháp bình phương giữa có chu kỳ ngắn;
e Hầu như các dữ liệu đầu ra luôn hội tụ về 0 sau một số bước hữu hạn b Phân tích thuật toán
Phương pháp bình phương giữa trong thực tế không phải là một phương pháp tốt, vì chu kỳ của nó thường rất ngắn và nó có một số điểm yếu là lặp đi lặp lại tạo cùng một số hoặc chu kỳ cho một số trước đó trong chuỗi và lặp vô hạn
Đối với một chương trình tao voi số khởi đầu có k chữ số, chu kỳ lặp lại không dài hơn 8# Một vấn dé cần lưu ý là nếu các chữ số ở giữa bằng 0 thì rất dé sinh ra các số ngẫu nhiên bằng 0 Trường hợp chọn độ dài của số khởi đầu là 4 chữ số, nếu trong quá trình lặp, 4 chữ số ở giữa có giá trị đều bằng 0, thì chương trình sẽ xuất ra các số 0 mãi mãi từ đó trở về sau Nếu nửa đầu của một số có giá trị là 0, cac số tiếp theo sẽ giảm dần xuống 0 Phương pháp bình phương giữa cũng có thé bi ket trên một số khác 0 Với k = 4, điều này xảy ra với các giá trị 0100, 2500, 3792 và 7600 Nghĩa là số sinh ra sẽ giống với số đang có Chẳng hạn, khi một x; = 0100 ta sé nhan duoc s = x? = 01007 = 00010000 và z;„; = 0100 Quá trình này tiếp
Trang 33tuc va sé sinh ra day số 0100 từ đó trở về sau Một số giá trị khởi đầu khác có xu hướng hình thành các chu kỳ lặp lại rất ngắn, chẳng hạn như: với giá trị khởi đầu là 0540 thì dãy số sinh ra là xạ = 0540, x, = 2916, x, = 5030, x3 = 3009, x, = 0540 (chu kỳ là 4) Hiện tượng này càng rõ ràng hơn khi n = 2, vì không một số nào trong số 100 được chọn làm số khởi đầu có thể tạo ra hơn 14 lần lặp mà không
hội tụ về số 0, 10, 60 hoặc vòng lặp với hai số 24, 57 c Cài đặt thuật toán
Trang 34
cout << "The random numbers are:\n" << number << ", "; for (ltt & S bp b Ki hy Bee) { number = middleSquareNumber (number, n); cout << number << ", ; }
d Đánh giá độ phức tạp của thuật toán
Gọi T(n) là thời gian lớn nhất đề thực hiện chương trình đối với mọi đữ liệu vào có cùng kích thước ?t Ta có, phép toán tích cực trong thuật toán là phép gắn có thời gian là Ø(1) Gọi phép gán trong đoạn lặp sinh ra : số ngẫu nhiên là P;, ta có
Tín) = 2 + }'P; = 2 + Từ đó suy ra T(n) = 0(n)
2.3.3 Phương pháp đồng dư bậc hai
Phương pháp đồng đư bậc hai còn có tên gọi khác là phương pháp đồng dư toan phuong (quadratic congruential generator) duoc phát triên bởi R R Coveyou Phương pháp này gần như tương đương với phương pháp nửa bình phương nhưng có chu kỳ dài hơn
a Phát biểu thuật toán
Thuật toán đồng đư bậc hai dùng dé sinh ra các số ngẫu nhiên với giá trị khởi dau la n > 0 và giá trị đồng dư ?m theo công thức x„„¡ = (đx2 + ax„ + €) mod mm,
Trong đó:
® x„ là chuỗi số ngẫu nhiên, với xạ = ?t là giá trị khởi đầu; e mlamodul (m > 0)
e a,d lacac sé nguyén va la thira sé nguyén t6 1é cia m; e_c là một số nguyên và là nguyên tố với m
Nếu mm là lũy thừa của 2, nghĩa là m = 2°, thì chúng ta có: © xX) mod 4 =2;
e Công thức sinh số ngẫu nhiên có thé viét lai la: x = x, (x, + 1) mod 2°
Trang 35V6i gid tri khéi dau n > 0 cho trude sao cho 0<n<m-—1, ching ta sé nhận được dãy l số giả ngau nhiên #ọ, #, ,¡_+ sinh ra bằng thuật toán này thỏa mãn 0 < #¡ <Srn— 1, Ví €{1,2, ,!— 1} Để nhận được dãy số giả ngẫu nhiên có phân phối đều trên nửa đoạn [0, 1) là x;~Umiƒ(0, 1), chúng ta đặt x¡ = x¡/m,
vi € {1,2, ,1— 1} Luc dé day xo, x1, .,X)_1 là dãy số giả ngẫu nhiên phân phối
déu trén ntra doan [0, 1)
Thuật tốn 2.2 Thuật tốn đơng dư bậc hai dé sinh ra dãy sé ngdu nhién Input: - ? là giá trị khởi đầu, rn là một số nguyên, ! là số lượng số ngẫu nhiên cần tao ra Output: Day | số ngẫu nhiên xọ, xạ, ,*¡_¡ x¡ € [0, 1], Vi € {0,1, , 1 — 1} Phương pháp: i=0; x[i]=n; while (i<l) { i=itl; x[iJ=(x[i-1]*(x[i-1]+1)) mod m; for (i=0; i<l; i++) x[i]=x[i]/m; Xuất x[0], x[1], , x[l-1] ra màn hình Vi dụ 2.4 Tạo 7 số ngẫu nhiên theo phương pháp đồng dư bậc hai với xạ = n = 2 và m = 16 « Tínhx[0]= n=2: « Tính x[1] = (x[0]* (x[0] + 1)) mod 16 = (2 * (2 + 1)) mod 16 = 6: e Tinh x[2] = (x[1]* (x[1]+ 1)) mod 16 = (6 * (6 + 1)) mod 16 = 10: « Tính x[3] = (x[2] * (x[2] + 1)) mod 16 = (10 * (10 + 1)) mod 16=14: « Tính x[4] = (x[3] * (x[3] + 1)) mod 16 = (14 * (14 + 1)) mod 16 = 2; e Tinh x[5] = (x[4] * (x[4] + 1)) mod 16 = (2 * (2 + 1)) mod 16 = 6:
e Tinh x[6] = (x[5] * (x[5] + 1)) mod 16 = (6 * (6+ 1)) mod 16 = 10;
Trang 36e Tinh x[7] = (x[6] * (x[6] + 1)) mod 16 = (10 * (10 + 1)) mod 16=14
e Dãy số ngẫu nhiên được tính bằng cách chia cho 16, chúng ta được đấy số sau đây: 0.000, 0.375, 0.625, 0.875, 0.125, 0.375, 0.625, 0.875
Nhận xét:
e Phương pháp đồng dư bậc hai được sử dụng khi rm là lũy thừa của 2
e Phương pháp đồng dư bậc hai có chu kỳ dài hơn so với phương pháp bình phương giữa
b Phân tích thuật toán
Phương pháp đồng dư bậc hai liên tưởng tới phương trình bậc hai một ấn, số ngẫu nhiên x„„¡ được sinh ra dựa vào việc bình phương một cách đệ quy số ngẫu nhiên Z„ Nếu ta lấy các hệ số đ, đ, c bằng 1 thì việc tính toán sẽ ít phức tạp hơn, ít phải dùng các hàm kiểm tra cho việc các hệ số này có thỏa mãn điều kiện hay không Điều này làm cho việc tính toán ít phức tạp hơn vì công thức của phương
pháp đồng dư bậc hai lúc này đơn giản là x„„ị = x„(X„ + 1) mod mm Ta chỉ cần
kiểm tra giá trị khởi đầu n mod 4 = 2 c Cài đặt thuật toán
Trang 37void randomInit () { for(int i=l;i<n;it+) { x[i]=(x[i-1]* (x[i-1]+1)) %M; printf ("Sd\t",x[i]); int main() { printf("\n nhap n:"); scanf ("$d", &n); printf("\n nhap nhan:"); scanf ("$d", &seed) ; kiemtra (seed) ; x[0]=seed; randomInit(); }
d Đánh giá độ phức tạp thuật toán
Trang 382.3.4 Phương pháp đồng dư tuyến tính
Phương pháp đồng dư tuyến tinh (linear congruential generators - LCG) duoc đề xuất bởi D H Lehmer vào năm 1948 [3] Đây là một trong những phương pháp thông dụng nhất dùng đề sinh số ngẫu nhiên bằng máy tính điện tử
a Phát biểu thuật toán
Thuật toán đồng dư tuyến tính dùng để sinh ra các số ngẫu nhiên với giá trị khởi đầu cho trước n > 0 và giá trị đồng dư n bằng cách sử dụng một hàm chuyển (transfer function) Xn44 = f (Xn) = (bX, + ¢) mod m Trong do:
® xạ =n là giá trị khởi đầu cho trước (0 < xạ < m);
e blà hằng số nhân (0 <b <m)
c là gia số (0 < e < m); m la modul (m > 0)
Voi gia trị khởi dau n > 0 cho tnréc sao cho0 <n <m—1, chung ta sé nhan duoc day 1 số giả ngẫu nhién xp, x,, ,%,_1 sinh ra bằng thuật toán này thỏa mãn 0 < x¡ <Srm — 1,Vi € {1,2, ,! — 1 Đề nhận được đãy số giả ngẫu nhiên có phân phối đều trén ntta doan [0, 1) la x;~Unif (0,1), ching ta dit x; = x;/m, Vi € {1,2, ,1 — 1} Lúc đó dãy xp, x4, ., X;_1 là dãy số giả ngẫu nhiên phân phối đều trên nửa đoạn [0, 1)
Thuật toán 2.3 Thuật toán đồng dư tuyén tinh dé tạo số ngẫu nhiên
Input: - ? là giá trị khởi đầu, n là một số nguyên, b là hằng số nhân (0 < b < m) c là gia số (0 < c < m); Ì là số lượng số ngẫu nhiên cần tạo ra
Output: Day | số ngẫu nhiên xọ, xạ, ,¡_¡, x; € [0, 1), Ví € {0,1, ,! — 1} Phương pháp:
3=0;
Trang 39
} for (i=0; i<l; i++) x[il=xlil/m; Xuất x[0], x[1], , x[l-1] ra màn hình Ví dụ 2.5 Tạo số 8 ngẫu nhiên theo phương pháp đồng dư tuyến tính với = 0, b=2,c=3vam= 10 e Tinh x[0] =n=0;
e Tinh x[1] = (b *x[0] +c) mod m = (2 *0 + 3) mod 10 = 3: e Tinh x[2] = (b*x[1] +c) mod m = (2 * 3+ 3) mod 10 = 9; e Tinh x[3] = (b*x[2] +c) mod m = (2 *9+ 3) mod 10 = 1, e Tinh x[4] = (b * x[3] +c) mod m = (2 *1+3)mod10=5; e Tinh x[5] = (b*x[4] +c) mod m = (2 *5 +3) mod 10 = 3; e Tinh x[6] = (b*x[5] +c) mod m = (2 * 3+ 3) mod 10 = 9; e Tinh x[7] = (b *x[6] +c) mod m = (2 * 9+ 3) mod 10 = 1; e Tinh x[8] = (b *x[7] +c) mod m = (2 *1+3)mod10=5;
Dãy số ngẫu nhiên được tính bằng cach chia cho 10, ching ta duoc day số sau day: 0.0, 0.3, 0.9, 0.1, 0.5, 0.3, 0.9, 0.1, 0.5 Nhan xét: Ham dé liéu ra (output function) thuong co mot trong các dạng sau: e g:N — (0,1), va g(x) = ¬ e g:N — [0,1), và g(x) = ¬ x+1/2 m e g:N — (0,1), va g(x) =
b Phan tich thuat toan
Theo nghiên cứu của D E Knuth [3], Knuth chứng minh rằng để có được số ngẫu nhiên tốt, chúng ta chọn các hằng số b, c và mm theo tiêu chí như sau:
Trang 40e Chon m: m nén duoc chon 1a mét số lớn, vì chu ky sẽ luôn luôn nho hon m nén khi m I6n thi chu kỳ lặp lại của các số sẽ giãn ra Thông thường, người ta chọn mm là lũy thừa của 10 hoặc lũy thừa của 2 sẽ đem lại nhiễu thuận lợi trong việc tính toán đồng đư
e Chọn b,c: một chuỗi được sinh ra bởi sơ đồ đồng dư tuyến tính có chu kỳ mm nếu và chỉ nếu:
-_ cnguyên tố cùng nhau với m;
- b— 1 là bội số của mọi số nguyên tố chia cho ?n; b— 1 là bội của 4 nếu m là bội của 4:
e Những ràng buộc này sẽ dẫn đến những giá trị số nhân có dạng b = ZP + 1, trong đó Z là cơ số được dùng trong biêu diễn số của máy tính, k là số lượng bit tối
k
đa của kiểu nguyên, ?n = Z” và Z < p <S k Nhưng đối với sự lựa chọn của b,c thì chúng phải thỏa mãn yêu cầu là nguyên tố cùng nhau với m
e Chọn ïø: nếu chu kỳ của chuỗi là ?m thì việc lựa chọn xạ = n là không quan trọng, vì toàn bộ chuỗi sẽ được sinh ra sau tối đa ?n số Tuy nhiên, chúng ta cần chú ý, khi chọn xạ = ® = 0 và sử dụng phương pháp đồng dư nhân sẽ dẫn đến một chuỗi thoái hóa
c Cài đặt thuật toán