2012-04-11 40 views
7

Mam metodę w klasie w następujący sposób ...liczb losowych nie tak losowe

class foo{ 
    int bar::randomNum10to50(){ 
     srand (time(NULL)); 
     int random10to50 = rand()%50+10; 
     return random10to50; 
    } 
} 

Jednak kiedy zadzwonić z main (tylko sprawdzić wyjście, bo nie był już z zachowania program spodziewałem) jak tak ....

to dokładnie ten sam numer za każdym razem jest prowadzony (tj 9,9,9,9,9, ....; następny bieg: 43, 43,433,43, .....) Nie wiem, co jest nie tak. Kod działa bardzo szybko, więc myślałem, że MOGĘ być problemem, ale nie widzę powodu, dla którego nie byłoby różnicy nawet między 20 iteracjami. Wszelkie przemyślenia są doceniane! Dzięki!

+0

"9,9,9,9,9" był 'typo', prawda? Zastanawiam się tylko, ponieważ wyniki powinny być osiągane tylko w przedziale od 10 do 50 ... – jorey

Odpowiedz

20

Trzeba zadzwonić srand()raz, poza funkcji Randomizer. W przeciwnym razie za każdym razem ponownie generuje się generator liczb losowych z tą samą wartością czasu, wytwarzając tę ​​samą początkową "losową" wartość.

+0

... dziękuję! Teraz czuję się głupio. –

6

Wywołujesz srand() z tym samym początkiem każdej iteracji pętli, ponieważ czas faktycznie nie ma, um, czasu do zmiany. Pamiętaj, aby zadzwonić tylko raz i wszystko powinno działać.

3

Cody Grey już mówi to, co robisz źle tutaj, ale tutaj jest przykład robi to z <random> Biblioteka:

#include <random> 

std::mt19937 make_seeded_engine() { 
    std::random_device r; 
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()}; 
    return std::mt19937(seed); 
} 

class foo { 
    std::mt19937 engine; 

public: 
    foo() : engine(make_seeded_engine()) {} 

    int randomNum10to50(){ 
     return std::uniform_int_distribution<>(10,50)(engine); 
    } 
}; 

foo create; 
for (int i=0; i<20;i++){ 
    cout << create.randomNum10to50() << '\n'; 
} 

Zauważ, że rand()%50 + 10 produkuje liczb w zakresie od 10 do 59, a nie 10 50. uniform_int_distribution jest lepsza, ponieważ zakres jaki dajesz to zakres jaki dostajesz, więc mniej prawdopodobne jest, że zepsujesz to. Również użycie uniform_int_distribution daje obiektywne wyniki, podczas gdy rand()%50+10 ma pewne niewielkie odchylenie.


Jeśli masz kompilatora z nieco bardziej C++ 11 wsparcie można zrobić:

class foo{ 
    std::mt19937 engine = make_seeded_engine(); 

public: 
    int randomNum10to50(){ 
     return std::uniform_int_distribution<>(10,50)(engine); 
    } 
}; 
+0

fajnie! Dzięki! Mogę w końcu z tego skorzystać. Dobra informacja! –

+0

Uwaga: Twój kompilator będzie musiał obsługiwać C++ 11, aby to zrobić, w przeciwnym razie możesz użyć boost, gdzie "" pochodzi z mojego przekonania. – AJG85

+0

@ AJG85 Tak, używa trochę C++ 11, ale starałem się ograniczyć to do tego, co jest szeroko obsługiwane. VS11 i gcc już w wersji 4.5 mogą to uruchomić. Ale myślę, że dodam wersję, która używa więcej C++ 11, aby to trochę posprzątać ... – bames53

Powiązane problemy