Bộ tạo số giả ngẫu nhiên song song


20

Câu hỏi này chủ yếu liên quan đến một vấn đề kỹ thuật phần mềm thực tế, nhưng tôi sẽ tò mò muốn biết liệu các nhà lý thuyết có thể cung cấp cái nhìn sâu sắc hơn về nó hay không.


Nói một cách đơn giản, tôi có một mô phỏng Monte Carlo sử dụng trình tạo số giả ngẫu nhiên và tôi muốn song song với nó để có 1000 máy tính chạy cùng một mô phỏng. Vì vậy, tôi cần 1000 luồng giả số độc lập.

Chúng ta có thể có 1000 luồng song song với các thuộc tính sau không? Ở đây nên là một PRNG rất nổi tiếng và được nghiên cứu rộng rãi với tất cả các loại tính chất lý thuyết và thực nghiệm tốt đẹp.X

  1. Các luồng có thể chứng minh tốt như những gì tôi sẽ nhận được nếu tôi chỉ đơn giản sử dụng và chia luồng được tạo bởi thành 1000 luồng.XX

  2. Tạo ra các số tiếp theo trong bất kỳ dòng là (hầu như) càng nhanh càng tạo ra các số tiếp theo với .X

Nói cách khác: chúng ta có thể nhận được nhiều luồng độc lập "miễn phí" không?

Tất nhiên, nếu chúng ta chỉ đơn giản sử dụng , luôn loại bỏ 999 số và chọn 1, thì chúng ta chắc chắn sẽ có thuộc tính 1, nhưng chúng ta sẽ mất trong thời gian chạy theo hệ số 1000.X

Một ý tưởng đơn giản là sử dụng 1000 bản , với các hạt 1, 2, ..., 1000. Điều này chắc chắn sẽ nhanh, nhưng không rõ ràng nếu các luồng có thuộc tính thống kê tốt.X


Sau một số Googling, tôi đã tìm thấy, ví dụ, như sau:

  • Các SPRNG thư viện dường như được thiết kế cho mục đích này chính xác, và nó hỗ trợ nhiều PRNGs .

  • Mersenne twister dường như là một PRNG phổ biến hiện nay và tôi đã tìm thấy một số tài liệu tham khảo về một biến thể có thể tạo ra nhiều luồng song song.

Nhưng tất cả những điều này nằm cách xa khu vực nghiên cứu của tôi, đến nỗi tôi không thể tìm ra đâu là công nghệ tiên tiến nhất, và công trình nào hoạt động tốt không chỉ trên lý thuyết mà cả trong thực tế.


Một số làm rõ: Tôi không cần bất kỳ loại tài sản mật mã nào; đây là tính toán khoa học Tôi sẽ cần hàng tỷ số ngẫu nhiên, vì vậy chúng tôi có thể quên bất kỳ trình tạo nào có khoảng thời gian .<232

Chỉnh sửa: Tôi không thể sử dụng RNG thực sự; Tôi cần một PRNG xác định. Thứ nhất, nó giúp rất nhiều với việc gỡ lỗi và làm cho mọi thứ có thể lặp lại. Thứ hai, nó cho phép tôi thực hiện, ví dụ, tìm kiếm trung bình rất hiệu quả bằng cách khai thác thực tế là tôi có thể sử dụng mô hình nhiều đường chuyền (xem câu hỏi này ).

Chỉnh sửa 2: Có một câu hỏi liên quan chặt chẽ @ StackOverflow: Trình tạo số giả ngẫu nhiên cho môi trường cụm .


6
Tại sao bạn không sử dụng PRNG với hạt được lấy mẫu độc lập? Tôi không hiểu làm thế nào điều này không thỏa mãn 1 và 2, vì bạn không cần sự phối hợp giữa các máy khác nhau1000
Sasho Nikolov

Tôi không phải là chuyên gia, nhưng gần đây (tìm kiếm thông tin về câu hỏi TCS) Tôi đã tìm thấy phần cứng này: idquantique.com/true-random-number-generator/, ... một bảng PCI có thể tạo ra luồng 16Mbits / giây (lượng tử) bit ngẫu nhiên. ... bạn có thể mua một loạt chúng và triển khai một vài máy chủ tạo số ngẫu nhiên ... không phải là một cách tiếp cận lý thuyết tuyệt vời nhưng các bit được đảm bảo là "tốt" :-) :-)
Marzio De Biasi

@Vor: Tôi muốn giữ mọi thứ lặp lại và xác định. Đưa ra một hạt giống cố định, tôi muốn nhận được kết quả chính xác tương tự nếu tôi chạy lại thử nghiệm. Và tôi muốn có thể chạy thử nghiệm tương tự trên một máy duy nhất và một lần nữa nhận được kết quả tương tự. (Đối với một, nó giúp ích rất nhiều khi gỡ lỗi các thuật toán song song ...)
Jukka Suomela

@Jukka: ok! ... và tôi cho rằng việc lưu trữ hàng tỷ bit hoang dã không thể chia sẻ cùng với kết quả thử nghiệm là không khả thi :-) ... cần có chuyên gia PRNG!
Marzio De Biasi

2
Cảm ơn cho câu trả lời từ trước đến nay! Hãy xem liệu chúng ta có được tham gia nhiều hơn với tiền thưởng không ...
Jukka Suomela

Câu trả lời:


7

Bạn có thể sử dụng một sự phát triển của thuật toán Mersenne Twister được phát triển bởi Saito và Matsumoto:

Twers nhanh Mersenne Twister (SFMT) theo định hướng SIMD

SFMT là trình tạo Đăng ký thay đổi phản hồi tuyến tính (LFSR) tạo ra số nguyên giả ngẫu nhiên 128 bit tại một bước. SFMT được thiết kế với sự song song gần đây của các CPU hiện đại, chẳng hạn như hướng dẫn đường ống nhiều giai đoạn và hướng dẫn SIMD (ví dụ: số nguyên 128 bit). Nó hỗ trợ các số nguyên 32 bit và 64 bit, cũng như điểm nổi chính xác gấp đôi làm đầu ra. SFMT nhanh hơn nhiều so với MT, trong hầu hết các nền tảng. Không chỉ tốc độ, mà cả kích thước của các phân phối ở độ chính xác v-bit cũng được cải thiện. Ngoài ra, phục hồi từ trạng thái ban đầu vượt quá 0 nhanh hơn nhiều. Xem Luận văn thạc sĩ của Mutsuo Saito để biết chi tiết .

Thời gian thay đổi từ đến 2 216091 - 1 .2607122160911

Sử dụng cùng một trình tạo số pesudorandom để tạo nhiều luồng độc lập bằng cách thay đổi các giá trị ban đầu có thể gây ra sự cố (với xác suất nhỏ không đáng kể). Để tránh sự cố, sử dụng các tham số khác nhau cho mỗi thế hệ được ưu tiên. Kỹ thuật này được gọi là tạo động của các tham số MT.

Trong mã nguồn SFMT, bạn có thể tìm thấy một số ví dụ về các bộ tham số (của các chu kỳ biến) và tập lệnh awk để chuyển đổi tệp CSV thành một bộ tham số có thể biên dịch được. Ngoài ra còn có một công cụ gọi là " Dynamic Creation of Mersenne Twister ".

Các tác giả gần đây đã phát triển một phiên bản sửa đổi khác của Mersenne Twister - Mersenne Twister cho Bộ xử lý đồ họa - được thiết kế để chạy trong GPU và tận dụng các luồng thực thi song song riêng của chúng. Tính năng chính là tốc độ: số nguyên ngẫu nhiên cứ sau 4,6ms trên GeForce GTX 260.5×107

Các khoảng thời gian của chuỗi được tạo là , 2 23209 - 12 44497 - 1 cho phiên bản 32 bit và 2 23209 - 1 , 2 44497 - 1 , 2 110503 - 1 cho phiên bản 64 bit. Nó hỗ trợ 128 bộ tham số cho từng thời kỳ, nói cách khác, nó có thể tạo ra 128 chuỗi số giả độc lập cho từng thời kỳ. Chúng tôi đã phát triển Dynamic Creator cho MTGP, tạo ra nhiều bộ tham số hơn2112131223209124449712232091244497121105031

Thật vậy, họ cung cấp một công cụ MTGPDC để tạo tối đa bộ tham số (tức là các luồng độc lập).232

Thuật toán vượt qua các bài kiểm tra ngẫu nhiên chính như Diehard và NIST.

Một bài báo sơ bộ cũng có sẵn trên arXiv: A Variant of Mersenne Twister Thích hợp cho Bộ xử lý đồ họa


Một công cụ có liên quan nhưng cũ hơn là Matsumoto và Nishimura (1998): Sáng tạo năng động của những người tạo số giả danh . Nhưng tôi đã không thể tìm ra công cụ nào trong số này chỉ là bằng chứng của khái niệm và đó là các gói phần mềm thế mạnh được sử dụng rộng rãi.
Jukka Suomela

@Jukka: có lẽ bạn có thể hỏi nó trực tiếp với các tác giả của thuật toán MTGP. Từ trang web của họ: "... Mọi phản hồi đều được chào đón (gửi email đến Mutsuo Saito, saito" tại ký "math.sci.hiroshima-u.ac.jp và m-mat" tại ký "math.sci.hiroshima- u.ac.jp) ... ". Có lẽ họ có thể không vô tư 100%, nhưng họ chắc chắn biết rõ những điểm mạnh và yếu của MTGP, và có thể cho bạn biết nếu nó có thể phù hợp với người bạn đời của bạn.
Marzio De Biasi

Có vẻ như Mersenne Twister + Dynamic Creation là cách được đề xuất để làm điều đó trong Mathematica.
Jukka Suomela

@Jukka: Cũng có thể tìm thấy gói MT + DC trên trang web của Matsumoto ( math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ); và tôi nghĩ rằng MTGP chỉ là một biến thể phù hợp với GPU. Vì vậy, MT + DC có vẻ là lựa chọn tốt hơn (và đã được kiểm tra / ổn định) (trừ khi bạn thực sự cần số nguyên ngẫu nhiên cứ sau 4,6ms trên mỗi luồng :-))))5×107
Marzio De Biasi

@Vor: Nếu bạn chỉnh sửa câu trả lời của mình và thay thế MTGP bằng dcmt , tôi có thể chấp nhận nó.
Jukka Suomela

12

Dường như có nhiều cách để giải quyết vấn đề này, nhưng một cách đơn giản là sử dụng Blum Blum Shub PRNG. PRNG này được xác định bởi mối quan hệ lặp lại , trong đó N là một bán kết. Để có được một bit ngẫu nhiên trong số này, bạn chỉ cần lấy bit chẵn lẻ của x i . Những gì tốt đẹp về vấn đề này là vì x i + k = x 2 k i  mod  N = x 2 k  mod  λ ( N ) ixi+1=xi2 mod NNxi bạn có thể tính trực tiếp bất kỳ bước nào trong hằng số thời gian theo k (tức là O ( log ( N ) 3 ) hoặc nhanh hơn tùy thuộc vào thuật toán nhân nào bạn sử dụng cho cấp số nhân mô-đun). Như vậy là bạn có M máy, sau đó cho máy được lập chỉ mục bởi y bạn có thể sử dụng máy phát điện x i + 1 , y = x 2 M mod  λ ( N ) i  mod  N , nơi x 0 , y = xxi+k=xi2k mod N=xi2k mod λ(N)mod NkO(log(N)3)Myxi+1,y=xi2Mmod λ(N) mod N, nơix0là dòng dõi ngươi. Thuận tiện điều này tạo ra chính xác cùng một dòng số như thể bạn đã sử dụng một luồng duy nhất và lần lượt phân phối đầu ra của nó cho từng máy.x0,y=x02y mod λ(N) mod Nx0

Tuy nhiên, đây không phải là PRNG nhanh nhất, vì vậy nó sẽ chỉ hữu ích nếu tổng chi phí của bất cứ điều gì bạn đang làm trong mô phỏng lớn hơn đáng kể so với chi phí của PRNG. Tuy nhiên đó là giá trị chỉ ra rằng nó sẽ được nhanh hơn nhiều cho sự kết hợp nào đó của N hơn những người khác, đặc biệt là nếu biểu diễn nhị phân của 2 M  mod  λ ( N ) có chứa vài 1s hoặc là nhỏ.MN2M mod λ(N)


1
Tôi nghĩ rằng sẽ nhanh hơn khi để mỗi máy tạo ra một phần liền kề của chuỗi, đặt chúng cách nhau quá xa để chúng không giao nhau. Dù sao, sử dụng Blum Blum Shub cho các ứng dụng phi mật mã có vẻ hơi quá mức.
Antonio Valerio Miceli-Barone

1
@Antonio: Vâng, điều đó sẽ nhanh hơn một chút, đặc biệt nếu bạn biết trước chính xác có bao nhiêu thử nghiệm bạn cần. Nếu bạn không biết, thì tôi nghĩ bạn cũng sẽ có được tỷ lệ tương tự. Wierdly Blum Blum Shub chính xác là PRNG mà chúng ta đã gặp trong vật lý tính toán nhiều năm trước. Nếu bạn không sử dụng nó cho mục đích mã hóa, bạn có thể sử dụng một mô-đun nhỏ hơn nhiều, vì vậy nó không thực sự chậm và đối với nhiều tác vụ, nó sẽ nhanh so với bất kỳ chức năng nào của biến ngẫu nhiên bạn cần tính toán.
Joe Fitzsimons

5

snX1000ns1,s2,,s10001i1000sin

X

Bây giờ, cho như hạt giống cho tôi thứ máy, trong đó sử dụng X để tạo ra dòng giả ngẫu nhiên của riêng mình.siiX

Với các tính chất tốt đẹp của , trừ khi s được biết, với bất kỳ 1 i < j 1000 , các hạt s is j đều độc lập tính toán. Hơn nữa, bạn chỉ phải tạo và lưu một hạt giống nhỏ (ví dụ: s ); do đó, cách tiếp cận này không cần nhiều sự ngẫu nhiên hoặc lưu trữ thực sự.Xs1i<j1000sisjs


Đây không phải là cách tiếp cận cơ bản giống như những gì @Antonio đề xuất: sử dụng PRNG để tạo hạt giống cho chính nó. Tôi có một chút cảm giác khó chịu về điều này ... Để đưa ra một ví dụ tầm thường về những gì có thể sai, hãy xem xét một PRNG trong đó output = trạng thái bên trong và hạt giống chỉ đơn giản là đặt trạng thái bên trong.
Jukka Suomela

@Jukka: Cách tiếp cận của tôi tương tự như của Antonio, nhưng cách của tôi thì chung chung hơn. PRNG trong ví dụ của bạn (trong đó output = trạng thái bên trong) dường như không được bảo mật bằng mật mã. Một PRNG được bảo mật bằng mật mã nếu đầu ra của nó không thể phân biệt được với phân phối thống nhất. Xem điều này để biết thêm. PS: Blum-Blum-Shub PRNG thỏa mãn điều kiện này.
MS Dousti

2

fM=1000{0,1,,M1}jif(i+jM)M

Điều này sẽ cung cấp cho bạn một RNG mật mã trên mọi quy trình, nhưng nó không nhất thiết phải đi kèm với chi phí hiệu suất. AES rất nhanh nếu bạn có phần cứng hỗ trợ và ChaCha cũng nhanh bất kể. Tất nhiên, bạn sẽ muốn đo lường điều này trong cài đặt cụ thể của mình để chắc chắn.

f


Nếu tôi không quan tâm đến sức mạnh mật mã, làm thế nào ChaCha (bộ đếm) so sánh với, ví dụ, Mersenne Twister? Nó nhanh hơn hay chậm hơn? Liệu nó có ít nhất là thuộc tính thống kê tốt? Tôi đã cố gắng google, nhưng không tìm thấy bất kỳ bài viết nào so sánh hai bài này trong bối cảnh không mật mã.
Jukka Suomela

2

Hiện tại đã có chức năng nhảy cho SFMT (triển khai Mersenne Twister nhanh).

Điều này cho phép tôi khởi tạo 1000 MT để không có chu kỳ trùng lặp. Và SFMT nên nhanh hơn MTGP. Gần như hoàn hảo cho mục đích của tôi.


1

Bạn chỉ có thể sử dụng 1000 phiên bản của Mersenne Twister được khởi tạo với các hạt khác nhau.

Bạn có thể lấy mẫu các hạt giống từ một Mersenne Twister khác, hoặc, để đảm bảo tính độc lập của chúng, từ trình tạo số giả mã hóa hệ điều hành (/ dev / urandom trong Linux).

Mersenne Twister luôn hoạt động theo cùng một chu kỳ, hạt điều khiển nơi bạn bắt đầu tạo nó. Với các hạt được lấy mẫu độc lập, mỗi máy phát sẽ bắt đầu tại các điểm khác nhau, thường là rất xa, với xác suất giao nhau rất nhỏ.


Vì vậy, MT có một số tính chất đặc biệt tốt đẹp đảm bảo rằng việc gieo MT với một MT khác có ý nghĩa gì không?
Jukka Suomela

MT có bất kỳ tính chất giả ngẫu nhiên có thể chứng minh?
Sasho Nikolov

@Jukka: không phải bất kỳ tôi biết. Đó là lý do tại sao tôi đề nghị sử dụng một loại PRNG khác để gieo hạt nếu bạn đặc biệt sợ một số loại tương quan lạ chưa biết.
Antonio Valerio Miceli-Barone

@Sasho: trang Wikipedia đề cập đến phân phối k và giai đoạn lớn.
Antonio Valerio Miceli-Barone

1
kk
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.