Saya pikir (versi yang sedikit dimodifikasi) metode 2 sebenarnya cukup mudah
Menggunakan definisi fungsi distribusi Pareto yang diberikan di Wikipedia
FX( x ) = {1 -(xmx)α0x ≥xm,x <xm,
jika Anda mengambil dan maka rasio ke dimaksimalkan pada , yang berarti Anda hanya dapat skala dengan rasio di dan menggunakan sampling penolakan langsung. Tampaknya cukup efisien.xm=12α = γhalxqx=FX( x +12) -FX( x -12)x = 1x = 1
Untuk lebih eksplisit: jika Anda menghasilkan dari Pareto dengan dan dan bulat ke bilangan bulat terdekat (bukan memotong), maka tampaknya mungkin untuk menggunakan sampel penolakan. dengan - setiap nilai dihasilkan dari proses tersebut diterima dengan probabilitas .xm=12α = γM.=hal1/q1xhalxM.qx
( sini sedikit dibulatkan karena saya malas; pada kenyataannya, kecocokan untuk kasus ini akan sedikit berbeda, tetapi tidak cukup untuk terlihat berbeda dalam plot - pada kenyataannya gambar kecil membuatnya terlihat agak terlalu kecil ketika sebenarnya sebagian kecil terlalu besar)M.
Penyesuaian yang lebih cermat terhadap dan ( untuk beberapa antara 0 dan 1 katakan) mungkin akan meningkatkan efisiensi lebih lanjut, tetapi pendekatan ini cukup baik dalam kasus yang saya mainkan.xmαα = γ- aSebuah
Jika Anda dapat memberikan beberapa pengertian tentang kisaran nilai yang khas, saya dapat melihat lebih dekat pada efisiensi di sana.γ
Metode 1 dapat disesuaikan dengan tepat, juga, dengan melakukan metode 1 hampir selalu, kemudian menerapkan metode lain untuk menangani ekor. Hal yang bisa dilakukan adalah cara yang mungkin sangat cepat.
Misalnya, jika Anda mengambil vektor bilangan bulat dengan panjang 256, dan mengisi , nilai dengan , nilai dengan dan seterusnya hingga - yang hampir akan gunakan seluruh array. Beberapa sel yang tersisa kemudian mengindikasikan untuk pindah ke metode kedua yang menggabungkan berurusan dengan ekor kanan dan juga potongan kecil 'sisa' dari bagian kiri.⌊ 256hal1⌋1
⌊ 256hal2⌋2
256halsaya< 1
Sisa kiri mungkin kemudian dilakukan dengan sejumlah pendekatan (bahkan dengan, katakanlah 'kuadratkan histogram' jika itu otomatis, tetapi itu tidak harus seefisien itu), dan ekor kanan kemudian dapat dilakukan dengan menggunakan sesuatu seperti pendekatan accept-reject di atas.
Algoritma dasar melibatkan menghasilkan integer dari 1 hingga 256 (yang hanya membutuhkan 8 bit dari rng; jika efisiensi adalah yang terpenting, operasi bit dapat mengambil yang 'dari atas', meninggalkan sisa dari nomor seragam (yang terbaik adalah dibiarkan sebagai nilai integer yang tidak dinormalkan ke titik ini) dapat digunakan untuk menangani sisa dan ekor kanan jika diperlukan.
Diimplementasikan dengan hati-hati, hal semacam ini bisa sangat cepat. Anda dapat menggunakan nilai dari 256 yang berbeda (mis. mungkin merupakan kemungkinan), tetapi semuanya secara teori sama. Namun, jika Anda mengambil meja yang sangat besar, mungkin tidak ada bit yang tersisa di seragam untuk itu cocok untuk menghasilkan ekor dan Anda membutuhkan nilai seragam kedua di sana (tetapi itu menjadi sangat jarang dibutuhkan, jadi itu tidak banyak. sebuah isu)2k216
Dalam contoh zeta (2) yang sama seperti di atas, Anda akan memiliki nilai 212 1
, 26 2
, 7 3
, 3 4
, satu 5
dan nilai dari 250-256 akan berurusan dengan sisa. Lebih dari 97% dari waktu Anda menghasilkan salah satu nilai dalam tabel (1-5).