Baru-baru ini saya terbiasa dengan bahasa modern yang mencakup generator acak yang bagus, yang biasanya adalah Twister Mersenne; sekarang saya kembali ke C ++ saya harus memutuskan apa yang akan digunakan.
Saya mencari implementasi Mersenne Twister dan saya perhatikan ada begitu banyak: apakah ada yang lebih banyak digunakan dan tersebar luas, atau apakah saya harus memilih satu dengan asumsi semuanya sama-sama bagus?
Jawaban:
C ++ 11 menyertakan generator Mersenne Twister secara default sebagai bagian dari
<random>
antarmuka barunya . Misalnya, untuk menghasilkan bilangan bulat secara seragam antara [-10, 10] menggunakan MT:Sebagian besar ini juga tersedia di setiap kompiler yang menawarkan TR1 meskipun namanya sedikit berbeda;
std::tr1::mt19937
danstd::tr1::uniform_int<int>
.Saya biasanya memperingatkan orang-orang agar tidak menggunakan Mersenne Twister. Ini algoritma yang oke tapi banyak popularitasnya hanya pemasaran. 624 dimensi keacakan lebih dari yang dibutuhkan kebanyakan orang, dan MT membawa persyaratan negara yang relatif berat dan ketika melakukan recalc tabel penuh, ia dapat meniup cache. Saya pribadi menyukai xorshift yang memberikan periode yang sangat baik dan distribusi yang masuk akal untuk apa pun yang dibutuhkan game, dengan memori kecil dan persyaratan CPU.
Saya telah menulis sebuah generator xorshift yang memenuhi standar C ++ 11-compliant - xorshift.hpp , xorshift.cpp - dan meletakkannya di domain publik. Anda dapat menyambungkan ini ke fungsi pengacakan C ++ 11 apa pun, seperti di atas:
sumber
RNG lain yang pernah saya gunakan sebelumnya untuk tujuan gamedev adalah RNG "kecil" Bob Jenkins, yang dijelaskan di sini .
(Ia juga memiliki RNG kekuatan-kriptografi yang disebut ISAAC, tetapi lebih besar dan lebih lambat, dan game tidak membutuhkan tingkat kekuatan seperti itu.)
sumber