Topik trending
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
Dalam episode horor pemrograman hari ini...
Dalam dokumen Python random.seed() def, kita diberitahu
"Jika a adalah int, itu digunakan secara langsung." [1]
Tetapi jika Anda menyemai dengan 3 atau -3, Anda benar-benar mendapatkan objek rng yang sama persis, menghasilkan aliran yang sama. (TIL). Dalam nanochat saya menggunakan tanda sebagai (apa yang saya pikir adalah) cara cerdas untuk mendapatkan urutan rng yang berbeda untuk pemisahan kereta / uji. Oleh karena itu bug gnarly karena sekarang train=test.
Saya menemukan kode CPython yang bertanggung jawab di cpython/Modules/_randommodule.c [2], di mana pada baris 321 kita lihat dalam komentar:
"Algoritma ini bergantung pada nomor yang tidak ditandatangani. Jadi: jika arg adalah PyLong, gunakan nilai absolutnya." diikuti dengan
n = PyNumber_Absolute(arg);
yang secara eksplisit memanggil abs() pada benih Anda untuk membuatnya positif, membuang bit tanda.
Tapi komentar ini sebenarnya salah/menyesatkan juga. Di bawah tenda, Python menyebut algoritma MT19937 Mersenne Twister, yang dalam kasus umum memiliki status bit 19937 (bukan nol). Python mengambil int Anda (atau objek lain) dan "menyebarkan" informasi itu di bit ini. Pada prinsipnya, bit tanda bisa digunakan untuk menambah bit status. Tidak ada tentang algoritma yang "bergantung pada nomor yang tidak ditandatangani". Keputusan dibuat untuk tidak memasukkan bit tanda (yang imo adalah kesalahan). Salah satu contoh sepele adalah memetakan n -> 2*abs(n) + int(n < 0).
Akhirnya ini membawa kita ke kontrak acak Python, yang juga tidak sepenuhnya dijabarkan dalam dokumen. Kontrak yang disebutkan adalah:
benih yang sama => urutan yang sama.
Tetapi tidak ada jaminan yang dibuat bahwa benih yang berbeda menghasilkan urutan yang berbeda. Jadi pada prinsipnya, Python tidak menjanjikan bahwa misalnya seed(5) dan seed(6) adalah aliran rng yang berbeda. (Meskipun ini cukup umum secara implisit diasumsikan dalam banyak aplikasi.) Memang, kita melihat bahwa benih(5) dan benih(-5) adalah aliran yang identik. Dan Anda mungkin tidak boleh menggunakannya untuk memisahkan perilaku latihan/pengujian Anda dalam pembelajaran mesin. Salah satu senjata kaki horor pemrograman yang lebih lucu yang saya temui baru-baru ini. Sampai jumpa di episode berikutnya.
[1]
[2]

Teratas
Peringkat
Favorit
