Angry Shoe ve Peterchen'in mükemmel cevaplarını 2015'teki son teknolojiye kısa bir genel bakışla tamamlamak istiyorum:
Bazı iyi seçimler
randutils
randutils
Kütüphane (sunum) basit bir arayüz ve (beyan) sağlam rastgele yetenekleri sunan ilginç bir yeniliktir. Projenize bağımlılık katması dezavantajlarına sahiptir ve yeni olduğu için kapsamlı bir şekilde test edilmemiştir. Her neyse, ücretsiz (MIT lisansı) ve yalnızca başlık olarak, denemeye değer olduğunu düşünüyorum.
Minimum örnek: bir kalıp silindiri
#include <iostream>
#include "randutils.hpp"
int main() {
randutils::mt19937_rng rng;
std::cout << rng.uniform(1,6) << "\n";
}
Kütüphaneye ilgi duyulmasa bile, web sitesi ( http://www.pcg-random.org/ ) genel olarak rastgele sayı oluşturma teması ve özel olarak C ++ kitaplığı hakkında birçok ilginç makale sunmaktadır.
Boost.Random
Boost.Random
(belgeler) ilham kütüphane C++11
's <random>
, kiminle paylaşır çok arayüz. Teorik olarak aynı zamanda harici bir bağımlılık olmakla birlikte, Boost
şimdiye kadar "yarı standart" kütüphane statüsüne sahiptir ve Random
modülü, kaliteli rasgele sayı üretimi için klasik seçim olarak kabul edilebilir. Çözüme göre iki avantajı vardır C++11
:
- daha taşınabilir, sadece C ++ 03 için derleyici desteğine ihtiyaç duyuyor
- onun
random_device
kaliteli tohumlama teklife kullandığı sisteme özel yöntemleri
Tek küçük kusur, modül teklifinin random_device
yalnızca başlık olmaması, derleme ve bağlantı kurma zorunluluğudur boost_random
.
Minimum örnek: bir kalıp silindiri
#include <iostream>
#include <boost/random.hpp>
#include <boost/nondet_random.hpp>
int main() {
boost::random::random_device rand_dev;
boost::random::mt19937 generator(rand_dev());
boost::random::uniform_int_distribution<> distr(1, 6);
std::cout << distr(generator) << '\n';
}
Minimal örnek işini iyi yaparken, gerçek programlar bir çift iyileştirme kullanmalıdır:
- make
mt19937
a thread_local
: jeneratör oldukça dolgun (> 2 KB) ve yığına tahsis edilmemesi daha iyi
mt19937
birden fazla tam sayıya sahip çekirdek : Mersenne Twister büyük bir duruma sahiptir ve başlatma sırasında daha fazla entropiden yararlanabilir
Bazı çok iyi olmayan seçimler
C ++ 11 kitaplığı
En deyimsel çözüm olmasına rağmen, <random>
kütüphane, temel ihtiyaçlar için bile arayüzünün karmaşıklığı karşılığında fazla bir şey sunmuyor. Kusur şudur std::random_device
: Standart, çıktıları için herhangi bir minimum kaliteyi zorunlu kılmamaktadır ( entropy()
geri dönüşler olduğu sürece 0
) ve 2015 itibariyle MinGW (en çok kullanılan derleyici değil, ancak ezoterik bir seçim) her zaman 4
minimum numuneye yazdıracaktır .
Minimum örnek: bir kalıp silindiri
#include <iostream>
#include <random>
int main() {
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<int> distr(1, 6);
std::cout << distr(generator) << '\n';
}
Uygulama çürümüş değilse, bu çözüm Boost çözümüne eşdeğer olmalıdır ve aynı öneriler geçerlidir.
Godot'un çözümü
Minimum örnek: bir kalıp silindiri
#include <iostream>
#include <random>
int main() {
std::cout << std::randint(1,6);
}
Bu basit, etkili ve temiz bir çözümdür. Sadece kusur, derlenmesi biraz zaman alacak - yaklaşık iki yıl, C ++ 17'nin zamanında piyasaya sürülmesi ve deneysel randint
işlevin yeni Standartta onaylanması şartıyla . Belki o zamana kadar tohumlama kalitesindeki garantiler de artacaktır.
Minimum örnek: bir kalıp silindiri
#include <cstdlib>
#include <ctime>
#include <iostream>
int main() {
std::srand(std::time(nullptr));
std::cout << (std::rand() % 6 + 1);
}
Eski C çözümü zararlı olarak kabul edilir ve iyi nedenlerle (buradaki diğer cevaplara veya bu ayrıntılı analize bakın ). Yine de avantajları vardır: basit, taşınabilir, hızlı ve dürüsttür, bir anlamda elde edilen rastgele sayıların pek uygun olmadığı ve bu nedenle onları ciddi amaçlar için kullanmaya cazip gelmediği biliniyor.
Muhasebe trolü çözümü
Minimum örnek: bir kalıp silindiri
#include <iostream>
int main() {
std::cout << 9;
}
9, normal bir kalıp silindiri için biraz alışılmadık bir sonuç olsa da, en hızlı, en basit, en önbellek dostu ve en taşınabilir çözüm olmayı başaran bu çözümdeki iyi niteliklerin mükemmel kombinasyonuna hayran olmak gerekir. 9'u 4 ile değiştirerek, her türden Zindan ve Ejderhalar ölürken mükemmel bir jeneratör elde ederken, sembol yüklü 1, 2 ve 3 değerlerinden kaçınıyor. Tek küçük kusur, Dilbert'in muhasebe trollerinin kötü huylu olması nedeniyle, bu program aslında tanımlanmamış davranışlara neden olur.