Dalam program saya, saya perlu menjalankan N utas terpisah masing-masing dengan RNG mereka sendiri yang digunakan untuk sampel dataset besar. Saya harus dapat menyemai seluruh proses ini dengan nilai tunggal sehingga saya dapat mereproduksi hasil.
Apakah cukup untuk meningkatkan benih secara berurutan untuk setiap indeks?
Saat ini saya menggunakan numpy
's RandomState
yang menggunakan Mersenne Twister pseudo-random number generator.
Cuplikan kode di bawah ini:
# 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)
Pada dasarnya saya memulai dengan seed yang dimasukkan pengguna (jika ada) dan untuk setiap instance / utas saya secara berurutan menambahkan indeks (0 hingga N-1) dari instance yang berjalan. Saya tidak tahu apakah ini praktik yang baik atau apakah ada cara yang lebih baik untuk melakukan ini.
Jawaban:
Ini bukan latihan yang bagus, tentu saja. Sebagai contoh, perhatikan apa yang terjadi ketika Anda melakukan dua run dengan seed root 12345 dan 12346. Setiap run akan memiliki
N-1
aliran yang sama.Implementasi Mersenne Twister (termasuk
numpy.random
danrandom
) biasanya menggunakan PRNG yang berbeda untuk memperluas seed integer ke dalam vektor state besar (624 integer 32-bit) yang digunakan MT; ini adalah array dariRandomState.get_state()
. Cara yang baik untuk melakukan apa yang Anda inginkan adalah menjalankan PRNG itu, diunggulkan dengan integer input Anda sekali, dan dapatkanN*624
integer 32-bit darinya. Pisahkan aliran itu menjadiN
vektor-vektor status dan gunakanRandomState.set_state()
untuk menginisialisasi setiapRandomState
instance secara eksplisit . Anda mungkin harus berkonsultasi dengan sumber Cnumpy.random
atau_random
dari perpustakaan standar untuk mendapatkan PRNG itu (semuanya sama). Saya tidak yakin apakah ada yang menerapkan versi mandiri dari PRNG untuk Python.sumber
RandomState
implementasi baru dalam pengembangan yang menggunakan algoritma yang memiliki aliran yang dapat diatur. Artinya, Anda menginisialisasi setiapRandomState
instance dengan seed yang sama dan ID aliran yang berbeda (hanya bertambah baik-baik saja), dan Anda dijamin aliran independen. pypi.python.org/pypi/randomstatesumber
Sekarang ada paket Python yang disebut RandomGen yang memiliki metode untuk mencapai ini.
Ini mendukung stream independen yang dibuat dari satu seed, serta protokol lompat untuk generator nomor acak yang lebih lama seperti MT19937.
sumber
Beberapa orang mengklaim bahwa ada korelasi dalam angka acak yang dihasilkan oleh biji berurutan. /programming/10900852/near-seeds-in-random-number-generation-may-give-similar-random-number Saya tidak yakin seberapa benar itu.
Jika Anda khawatir tentang hal itu, mengapa tidak menggunakan generator nomor acak tunggal untuk memilih benih untuk semua generator lainnya?
sumber