2016-04-08 15 views
-3

Bu yüzden, 1-100 arası 10,000 rastgele sayı üretmeye çalışıyorum, ancak yalnızca 99'a kadar sayı üretiyor çünkü görüntülediğimde yalnızca 1-99 arasında göremiyorum. onu bulmak için kodum. Kodumda neler oluyor, sayıların kaç kez üretildiğini bulmaya çalışıyorum. Temelde bir frekans/histogram.randomizer yalnızca 99 C++ 'ya kadar üretiyor

DÜZENLEME: 100 elde ediyorum, ama onun göstermek değil, ben burada bir hata olsun benim kodudur:

vector<int> vint; 

for (int i = 0; i < 10000; i++) 
{ 
    int x = (rand() % 100) + 1; 
    vint.push_back(x); 
} 

frequency(vint); 

void frequency (vector<int> v1) 
{ 
int counter = 1; 
int max = 0; 
int mode = v1[0]; 
int numbercheck = 0; 
for (int pass = 0; pass < 10000-1 ; pass++) 
{ 
    if (v1[pass] == v1[pass + 1]) 
    { 
     counter++; 
     numbercheck++; 

    } 
    else 
    { 
     cout << v1[pass] << ": " << counter << "..................." << endl; 
     counter = 1; 

    } 
} 
+0

Kodunuz bana öyle görünüyor ki, rand() 99 tane üretmemiş olabilir ve bu nedenle 1'inizin eklenmesi işe yaramamış olabilir. Lütfen boyutu artırın ve 100 elde edip edemeyeceğinizi görün. Döngü için üretim için dış işlevdir. – user902384

+0

Unutmayın ki rand() 'çok rasgele değildir, bu yüzden kriptografik olarak rastgele sayılara ihtiyacınız varsa daha iyi bir jeneratör kullanmak isteyebilirsiniz. Bu kodla 0-99 aralığında değerler almalısınız, +1 değeri 1-100'e kaydırmalı, ancak 100 haddeleme 100'lük bir haddedir. Asla 100 almadığınızdan emin olmak için yeterli veri ürettiğinize emin misiniz? Rastgele fonksiyonunuzun dağılımını test ettiniz mi? – tadman

+1

Kodunuz derlenmiyor, ancak kendi kendine yeten, minimal, çalışan bir örnek oluşturmak için kolayca yazabilirsiniz. Lütfen kodunuzu, değişiklik yapmadan çalıştırılabilmesi için düzenleyin. – Richard

cevap

2

sonra rand() kullanmaktan kaçınmak ve Mersenne- kullandığınız bir c++11 uyumlu derleyici kullanıyorsanız Daha yüksek kalitede rastgele diziler için Twister motoru.

#include <random> 

int main(void) { 
    std::random_device rd; // for random seed 
    std::seed_seq seed{rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()}; 
    std::mt19937 eng(seed); 

    const int min = 1; 
    const int max = 100; 

    // used to generate ints in interval [min,max] (inclusive) 
    std::uniform_int_distribution<int> dist(min,max); 

    int randomInt = dist(engine); // generate random int using dist and mtengine 

    return 0; 

} 

rand() neden kötü olduğunu bazı nedenlerden dolayı bu (eğlenceli) videoyu izleyin:

https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

+2

Bu, işlere daha iyi bir yaklaşım. Güzel! – tadman

+1

OP'nin kodundaki suçun rand() olduğunu nasıl anladınız? –

+0

Elbette ki bu soruya cevap vermiyor, ancak rastgele sayı üretmenin doğru yolunu gösteriyor. – bames53

0

Sen Başpiskopos cevabını kabul etmelidir İşte bir kod parçacığı örneğidir. İşte sizin için daha basit bir program.

#include <iostream> 
#include <vector> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    vector<int> vint; 

    for(int i=0; i<10000; ++i) 
    { 
     vint.push_back(rand()%100 + 1); 
    } 

    for(const auto&e: vint) 
     cout << e << endl; 

    return 0; 
} 

Bu benim için 100 üretildi, ancak sizin için oluşturulamayabilir.

+0

Hayır, ArchBishop'un cevabını kabul etmemeli, çünkü ne bu ne de bu kod problemi çözmüştür (düzenlendiği gibi ...). –

+0

Onun ilk yorumuna yaptığım döngü için yersiz görüneceği için onun kodu derlenmeyecek. Bu kod sadece örnek vermektir. – user902384

İlgili konular