SORU
15 ŞUBAT 2011, Salı


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:

enter image description here

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
26 ŞUBAT 2011, CUMARTESİ


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 ints 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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Griffin Gibson

    Charles Grif

    26 NİSAN 2006
  • happyjpy

    happyjpy

    22 AĞUSTOS 2009
  • Vsauce

    Vsauce

    30 Temmuz 2007