Oluşturmak rasgele bir dizi tamsayı
Verilen aralığı (sınır değerler dahil) rastgele bir tamsayı üretecek olan bir fonksiyon ihtiyacım var. Mantıksız kalite/Turk şartları bilmiyorum, dört koşul var:
- Hızlı olmam gerek. Projemi milyonlarca (veya hatta bazen milyonlarca) rasgele sayı üretmek için ihtiyaç ve akım üreteci benim görevim, bir darboğaz olduğu kanıtlanmıştır.
- Bu makul üniforma olmak istiyorum (rand() gayet iyi.
- min-max aralıkları&; 0, 1^ lt herhangi bir şey olabilir . <-32727, 32727>.
- seedable olmalı.
Ben şu anda C aşağıdaki kodu var:
output = min (rand() * (int)(max - min) / RAND_MAX)
Sorun gerçekten üniforma değil, - max sadece rand döndürülür() = RAND_MAX (Visual C için 1/32727). Bu küçük aralıkları&; -1, 1^ gibi lt için önemli bir konudur . en son ne zaman değeri neredeyse hiç döndürülür.
Kalem ve kağıt aldım ve formül (int) (0.5 n) tamsayı yuvarlama hile üzerine inşa edilmiştir) aşağıdaki ile geldi:
Ama yine de bana düzgün dağılım vermez. 10000 örnekleri tekrar çalışır değerler için bana 37:50:13 oranı değerleri -1, 0. 1.
Önermek daha iyi bir formül misiniz? (hatta sözde rasgele tam sayı üreteci işlevi)
CEVAP
Derleyici C 0 x destekler ve kullanıyorsanız sizin için bir seçenek olduğunu, <random>
yeni standart Başlığı ihtiyaçlarınızı karşılayacaktır. Minimum ve maksimum sınırları (ihtiyaç olarak dahil) kabul edeceği 8* *yüksek bir kalite var, ve çeşitli rastgele sayı üreticileri arasında dağıtım takın seçebilirsiniz.
Burada bir milyon int
s rasgele oluşturduğu kodu düzgün [-57, 365] dağıtılmış. Yeni std <chrono>
tesislerin performans sizin için önemli bir husustur sizin de bahsettiğiniz gibi o zaman kullandım.
#include <iostream>
#include <random>
#include <chrono>
int main()
{
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::duration<double> sec;
Clock::time_point t0 = Clock::now();
const int N = 10000000;
typedef std::minstd_rand G;
G g;
typedef std::uniform_int_distribution<> D;
D d(-57, 365);
int c = 0;
for (int i = 0; i < N; i)
c = d(g);
Clock::time_point t1 = Clock::now();
std::cout << N/sec(t1-t0).count() << " random numbers per second.\n";
return c;
}
Bana (2.8 GHz Intel Core ı5) bu çıktı:"
2.10268 e 07 saniyede bir rasgele sayı.
Kendi kurucusuna bir int geçerek jeneratörü tohumu:
G g(seed);
EÄŸer daha sonra int
dağıtım için gereken kapsaması yok ettiğini, bu yüzden gibi uniform_int_distribution
(long long
gibi) değiştirerek çözülebilir:
typedef std::uniform_int_distribution<long long> D;
EÄŸer daha sonra minstd_rand
yeterince yüksek kalitede bir jeneratör değil, ve eğer bu da kolayca takas edilebilir. E. g.:
typedef std::mt19937 G; // Now using mersenne_twister_engine
Rastgele sayı üreteci ve rastgele dağıtım üzerinde ayrı bir kontrol sahibi oldukça rahatlatıcı olabilir.
Ben de hesaplanan (gösterilmez) ilk 4 "anlar" bu dağıtım (kullanarak minstd_rand
) ve onlara göre theoretical values teşebbüs ölçmek kalitesi dağılımı:
min = -57
max = 365
mean = 154.131
x_mean = 154
var = 14931.9
x_var = 14910.7
skew = -0.00197375
x_skew = 0
kurtosis = -1.20129
x_kurtosis = -1.20001
(x_
önek gösterir "") bekleniyor
Consistenly aynı rasgele numpy dizi ol...
Nasıl alfa-sayısal rasgele bir dize ol...
Nasıl C rasgele tamsayı sayı üretmek m...
Bir Dizi hassas kaybetmeden git o Java...
Nasıl Java genel bir dizi oluşturmak i...