Thế hệ số giả ngẫu nhiên


8

Tôi đã sử dụng MT19937trong khai thác thử nghiệm để tạo các giá trị 32 bit [0, - 1] thống nhất, dựa trên triển khai mt19937.c của Tác giả ban đầu , để tạo ra nguồn cung cấp ngẫu nhiên (về cơ bản là vô tận) của các octet bit. Điều này thay cho CSPRNG, không cần thiết cho các thử nghiệm cụ thể này. Tuy nhiên, gần đây tôi đã xem xét các PRNG - không phải vì các thuộc tính thống kê như vậy (cả hai dường như không đủ cho nhu cầu của tôi) - nhưng chúng dường như đề xuất một triển khai hiệu quả hơn.232WELL

Tôi thiếu nền tảng toán học cho các bài báo học thuật, mặc dù ít nhất tôi có thể theo ma trận 'xoắn' và biến đổi ủ cho cái trước. Tuy nhiên, phần lớn mã được cung cấp bởi các Tác giả của các WELL-nhàm dường như tập trung vào việc tạo dấu phẩy động, với một số hằng số dấu phẩy động kỳ diệu (ví dụ 2.32830643653869628906e-10:). Các bước có thể được bỏ qua khỏi WELLmã để cung cấp phân phối 32 bit thống nhất không? Hoặc là thuật toán được thiết kế / thiên vị cụ thể cho các phân phối dấu phẩy động?

Hoặc tôi là một người không chính xác trong suy nghĩ WELLsẽ mang lại hiệu suất tăng cho thế hệ vector uint32 'số lượng lớn', trong khi đáp ứng yêu cầu của tôi?


1
Nếu đây chỉ là sự tò mò, thì tốt thôi, nhưng hiệu suất thực sự luôn phụ thuộc vào những gì khác đang diễn ra. Nếu việc tạo số ngẫu nhiên tiêu tốn 10% tổng thời gian và bạn có thể giảm một nửa, điều đó mang lại cho bạn tốc độ tăng 5%, điều này có thể không đáng để gặp rắc rối.
Mike Dunlavey

Có lẽ lạc đề, nhưng cũng đáng để xem xét các trình tạo chế độ truy cập như deshawresearch.com/resource_random123.html , yêu cầu bộ nhớ xa, ít hơn rất nhiều và song song hóa tầm thường.
Geoffrey Irving

1
Là một bản cập nhật, bây giờ tôi đang nghiêng về PCGRNG. Chúng nhanh hơn nhiều, có thể cung cấp thời gian rất dài (cũng như nhiều luồng) với các đặc tính tuyệt vời về mặt thống kê và dường như phục hồi rất nhanh từ các IV nghèo.
Brett Hale

Câu trả lời:


4

Tôi tưởng tượng rằng hầu hết người dùng của các trình tạo số ngẫu nhiên cuối cùng đều quan tâm đến các giá trị dấu phẩy động. Đây là lý do tại sao Fast Mersenne Twister (dSFMT) định hướng chính xác gấp đôi SIMD tồn tại. Tuy nhiên, có mã C mới hơn cho WELL RNG trả về unsigned longgiá trị. Nhìn vào mã, có vẻ như phiên bản trước đó đang được unsigned longsử dụng doubleđể bạn có thể tìm ra những gì họ đang làm bằng cách so sánh hai phiên bản.

Nếu bạn chủ yếu quan tâm đến tốc độ, tôi không nghĩ rằng đây là PRNG cho bạn. Tốc độ / hiệu suất mà các tác giả đề cập đến không phải là thuật toán tạo ra các biến thiên ngẫu nhiên nhanh như thế nào , mà là tốc độ phục hồi của nó từ một khởi tạo kém . Điều này cải thiện các thuộc tính thống kê của trình tạo WELL. Xem phần 6 của luận án thạc sĩ (PDF) của Mutsuo Saito để biết chi tiết về ý nghĩa của điều này. Các xét nghiệm như vậy được thực hiện với các trạng thái ban đầu trong trường hợp xấu nhất nhân tạo nên tôi không rõ tác dụng của việc sử dụng nói chung là gì.

Việc tạo số ngẫu nhiên có thể khá tốn kém thường xuyên mặc dù có trực giác của một người và là một ứng cử viên tối ưu hóa rất tốt với điều kiện là mã của bạn đang dành một lượng thời gian hợp lý để tạo ra các giá trị ngẫu nhiên. Trong các thử nghiệm hiệu năng đơn giản của riêng tôi (Retina MacBook Pro, OS X 10.9), tôi thấy WELL RNG nhanh bằng khoảng một phần ba so với Fast Mersenne Twister (SFMT) dựa trên số nguyên hiện tại khi sản xuất uint32các giá trị. SFMTcũng có hỗ trợ cho uint64. Tôi cũng thấy cổ điển mt19937ar.cmã để khoảng nửa càng nhanh như SFMT.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.