CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng trên blog CFSDN này tóm tắt các phương pháp tạo số ngẫu nhiên trong Ruby, được tác giả thu thập và biên soạn. Nếu bạn quan tâm đến bài viết này, vui lòng thích nó.
Các con số thực ra không phải là ngẫu nhiên.
Không có máy tính nào có thể tạo ra những con số thực sự ngẫu nhiên chỉ bằng tính toán. Điều tốt nhất mà chúng có thể làm là tạo ra các số giả ngẫu nhiên, tức là một tập hợp các số có vẻ ngẫu nhiên nhưng thực chất lại không ngẫu nhiên.
Đối với người quan sát, những con số này có vẻ ngẫu nhiên. Sẽ không có chuỗi lặp lại ngắn nào và ít nhất là đối với người quan sát, chúng sẽ có vẻ hoàn toàn ngẫu nhiên. Tuy nhiên, nếu có đủ thời gian và động lực, chúng ta có thể tìm ra hạt giống ban đầu, tạo lại chuỗi và đoán số tiếp theo trong chuỗi.
Do đó, các phương pháp được thảo luận trong bài viết này có lẽ không nên được sử dụng để tạo ra các con số phải được bảo mật bằng mật mã.
Như đã đề cập ở trên, các trình tạo số giả ngẫu nhiên (PRNG) phải được khởi tạo sao cho chúng tạo ra một chuỗi khác nhau mỗi khi một số ngẫu nhiên mới được tạo ra. Hãy nhớ rằng, không có phương pháp nào là kỳ diệu cả - những con số ngẫu nhiên này được tạo ra bằng một thuật toán và phép tính số học tương đối đơn giản. Bằng cách gieo hạt PRNG, bạn có thể bắt đầu từ một điểm khác nhau mỗi lần. Nếu bạn không gieo hạt, nó sẽ tạo ra cùng một chuỗi số mỗi lần.
Trong Ruby, phương thức kernel#srand có thể được gọi mà không cần đối số. Nó sẽ chọn một số ngẫu nhiên dựa trên thời gian, ID tiến trình và số thứ tự. Chỉ cần gọi srand ở bất kỳ đâu khi bắt đầu chương trình và nó sẽ tạo ra một chuỗi số ngẫu nhiên khác nhau mỗi khi bạn chạy. Phương pháp này được gọi ngầm khi chương trình khởi động và khởi tạo PRNG với thời gian và ID quy trình (không có số thứ tự).
Tạo số.
Phương thức Kernel#rand có thể được gọi khi chương trình đang chạy và kernel#srand đã được gọi ngầm định hoặc rõ ràng. Phương pháp này được gọi mà không có đối số và sẽ trả về một số ngẫu nhiên từ 0 đến 1. Trước đây, con số này thường được điều chỉnh theo số lớn nhất mà bạn muốn tạo ra, có thể sử dụng lệnh gọi to_i để chuyển đổi nó thành số nguyên.
?
1
2
|
đặt (rand() *
10
).đến_tôi
|
Tuy nhiên, nếu bạn sử dụng Ruby 1.9.x, Ruby sẽ giúp mọi việc trở nên dễ dàng hơn. Phương thức Kernel#rand có thể chấp nhận một đối số duy nhất. Nếu đối số là bất kỳ kiểu số nào, Ruby sẽ tạo ra một số nguyên từ 0 đến (không bao gồm) số đó.
Nhưng nếu bạn muốn tạo một số từ 10 đến 15 thì sao? Thông thường, bạn sẽ tạo một số từ 0 đến 5 và cộng với 10. Tuy nhiên, Ruby làm cho việc này trở nên dễ dàng hơn.
Bạn có thể truyền một đối tượng Range cho Kernel#rand và nó sẽ thực hiện đúng như bạn mong đợi: tạo ra một số nguyên ngẫu nhiên trong phạm vi đó.
Hãy chú ý đến cả hai loại phạm vi. Nếu bạn gọi rand(10..15), một số từ 10 đến 15, bao gồm cả 10 và 15, sẽ được tạo ra. Và RAND(10...15) (có 3 dấu chấm) sẽ tạo ra một số từ 10 đến 15, không tính số 15.
Số nonce không ngẫu nhiên.
Đôi khi bạn cần một chuỗi số trông có vẻ ngẫu nhiên, nhưng bạn cần phải tạo ra cùng một chuỗi số đó mỗi lần. Ví dụ, nếu bạn tạo số ngẫu nhiên trong một bài kiểm tra đơn vị, bạn nên tạo cùng một chuỗi số mỗi lần.
Một bài kiểm tra đơn vị không thành công ở một trình tự sẽ lại thất bại ở lần chạy tiếp theo, nhưng nếu nó tạo ra một trình tự khác ở lần chạy tiếp theo thì có thể nó sẽ không thất bại. Để thực hiện việc này, hãy gọi kernel#srand với giá trị hằng số đã biết.
?
1
2
3
4
5
|
srand(
5
)
đặt (
0
..
10
).bản đồ{rand(
0
..
10
)}
|
Lưu ý rằng triển khai kernel#rand không phải là Ruby. Nó không trừu tượng hóa PRNG theo bất kỳ cách nào và cũng không cho phép khởi tạo PRNG. Đối với PRNG, tất cả mã đều chia sẻ trạng thái toàn cục. Nếu bạn thay đổi hạt giống hoặc thay đổi trạng thái của PRNG, tác động có thể lan rộng hơn bạn mong đợi.
Tuy nhiên, vì chương trình mong đợi kết quả của phương pháp này là ngẫu nhiên (vì đó là mục đích của nó) nên điều này có lẽ sẽ không bao giờ là vấn đề. Chỉ khi chương trình mong đợi thấy một chuỗi số mong muốn, chẳng hạn như khi gọi srand với giá trị hằng số, thì chương trình mới thấy được kết quả không mong muốn.
Cuối cùng, bài viết này về tóm tắt phương pháp tạo số ngẫu nhiên của Ruby kết thúc tại đây. Nếu bạn muốn biết thêm về tóm tắt phương pháp tạo số ngẫu nhiên của Ruby, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!