Cách tốt nhất để tạo N tạo số ngẫu nhiên độc lập từ 1 giá trị


10

Trong chương trình của tôi, tôi cần chạy N luồng riêng biệt với mỗi RNG riêng được sử dụng để lấy mẫu một tập dữ liệu lớn. Tôi cần có khả năng gieo mầm toàn bộ quá trình này với một giá trị duy nhất để tôi có thể tái tạo kết quả.

Có đủ để đơn giản tăng tuần tự hạt giống cho mỗi chỉ số?

Hiện tại tôi numpyđang RandomStatesử dụng bộ tạo số giả ngẫu nhiên Mersenne Twister.

Đoạn mã dưới đây:

# If a random number generator seed exists
if self.random_generator_seed:
    # Create a new random number generator for this instance based on its
    # own index
    self.random_generator_seed += instance_index
    self.random_number_generator = RandomState(self.random_generator_seed)

Về cơ bản, tôi bắt đầu với một hạt giống do người dùng nhập vào (nếu nó tồn tại) và với mỗi phiên bản / luồng, tôi tuần tự thêm chỉ mục (0 đến N-1) của cá thể đang chạy. Tôi không biết liệu đây là cách thực hành tốt hay liệu có cách nào tốt hơn để làm việc này không.


1
Bạn có biết trước có bao nhiêu giá trị giả ngẫu nhiên mà mỗi luồng sẽ sử dụng - hoặc ít nhất bạn có thể có được ước tính giới hạn trên tốt không?
whuber

Không tôi không thể. Nó lấy mẫu các vùng được tính tổng cho đến khi có ngưỡng. Kích thước của các khu vực có thể thay đổi đáng kể.
EricR

Câu trả lời:


9

Đó không phải là thực hành tuyệt vời, chắc chắn. Ví dụ, hãy xem xét những gì xảy ra khi bạn thực hiện hai lần chạy với các hạt gốc là 12345 và 12346. Mỗi lần chạy sẽ có N-1các luồng chung.

Việc triển khai Mersenne Twister (bao gồm numpy.randomrandom) thường sử dụng một PRNG khác để mở rộng hạt giống số nguyên thành vectơ trạng thái lớn (624 số nguyên 32 bit) mà MT sử dụng; đây là mảng từ RandomState.get_state(). Một cách tốt để làm những gì bạn muốn là chạy PRNG đó, được gieo bằng số nguyên đầu vào của bạn một lần và lấy N*624số nguyên 32 bit từ nó. Tách luồng đó thành Ncác vectơ trạng thái và sử dụng RandomState.set_state()để khởi tạo rõ ràng từng RandomStatetrường hợp. Bạn có thể phải tham khảo các nguồn C của numpy.randomhoặc _randomtừ thư viện chuẩn để có được PRNG đó (chúng giống nhau). Tôi không chắc có ai đã triển khai phiên bản PRNG độc lập cho Python đó không.


Tôi nghĩ rằng đây có thể là giải pháp tốt nhất mà tôi đã nghe cho đến nay. Tôi không nghĩ nó quan trọng lắm về cách tôi chia luồng mặc dù đúng? Dường như không có chuỗi trùng lặp trên 624 số nguyên 32 bit giữa các trường hợp cho dù chúng được chọn từ PRNG và hạt giống ban đầu như thế nào.
EricR

1
Trên thực tế, tôi sẽ đi bộ này một chút. Tôi không rõ ràng rằng PRNG trình khởi tạo được thiết kế để có nhiều giá trị được rút ra từ nó. Xem xét sử dụng PRNG chất lượng khác (tốt nhất là không liên quan đến MT) để tạo luồng trạng thái. Người ta có thể triển khai một HMAC-DRBG (PRNG sử dụng HMAC làm nguyên thủy mã hóa) chỉ sử dụng thư viện chuẩn tương đối đơn giản. Bảo mật mật mã không phải là một mối quan tâm; chỉ cần dễ dàng thực hiện và chất lượng của dòng bit. Bạn sẽ cần đảm bảo rằng không có vectơ hoàn toàn nào được tạo ra, trong trường hợp rất hiếm khi xảy ra.
Robert Kern

Hoặc chỉ sử dụng một trong những RandomStatetriển khai mới hơn trong phát triển sử dụng thuật toán có các luồng có thể thiết lập được. Nghĩa là, bạn khởi tạo từng RandomStatephiên bản với cùng một hạt giống và ID luồng khác nhau (chỉ tăng lên là ổn) và bạn được đảm bảo các luồng độc lập. pypi.python.org/pypi/randomstate
Robert Kern

4

Φ(bạn)bạnN

  1. Φ(bạn),ΦN(bạn),Φ2*N(bạn),...
  2. Φ2(bạn),Φ1+N(bạn),Φ1+2*N(bạn),...
  3. ...
  4. ΦN-1(bạn),ΦN-1+N(bạn),ΦN-1+2*N(bạn),...

Φn(bạn)= =Φ(Φn-1(bạn))


2

Hiện tại có một gói Python có tên RandomGen có các phương thức để đạt được điều này.

hỗ trợ các luồng độc lập được tạo từ một hạt giống, cũng như giao thức nhảy cho các trình tạo số ngẫu nhiên cũ hơn như MT19937.


0

Một số người cho rằng có sự tương quan trong các số ngẫu nhiên được tạo ra bởi các hạt liên tiếp. /programming/10900852/gần-seệt-in-random-number-generation-may-give-similar-random-numbers Tôi không chắc điều đó đúng như thế nào.

Nếu bạn lo lắng về nó, tại sao không sử dụng một trình tạo số ngẫu nhiên duy nhất để chọn hạt giống cho tất cả các trình tạo khác?


Đơn giản vì tôi không muốn có bất kỳ cơ hội nào để tạo ngẫu nhiên cùng một hạt giống cho hơn 1 trình tạo. Tất nhiên tôi có thể thực hiện một số công việc lập trình để ngăn chặn điều này xảy ra nhưng sau đó tôi không biết làm thế nào tốt hơn là chọn hạt giống theo tuần tự.
EricR

1
Rõ ràng , có thể có mối tương quan với các hạt liên tiếp ... Tuy nhiên, như bài viết được liên kết trong câu trả lời từ blog của John D Cook cho thấy, sử dụng một RNG để tạo hạt giống cho các máy phát điện khác còn tồi tệ hơn nhiều, vì bạn gặp phải vấn đề sinh nhật! Nó nói rằng việc tạo ra 1000 hạt không dấu 16 bit ngẫu nhiên có 99,9% cơ hội trùng lặp!
Praveen
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.