2012-12-15 18 views
21

W tym raczej proste C++ fragmencie kodu udziałem generowania liczb losowych:rand() zwraca ten sam numer za każdym razem program jest uruchamiany

include <iostream> 
using namespace std; 

int main() { 
    cout << (rand() % 100); 
    return 0; 
} 

Dlaczego zawsze otrzymuję moc 41? Próbuję uzyskać to, aby wypisać pewną liczbę losową z przedziału od 0 do 100. Może nie rozumiem czegoś o tym, jak działa funkcja rand?

+45

nie 41 jest dość przypadkowy? Nie pomyślałbym o tym na pewno ... –

+4

Zapomniałeś zainicjować 'srand' (http://en.cppreference.com/w/cpp/numeric/random/rand) – Borgleader

+0

czy nie powinno być inaczej numer za każdym razem, gdy go uruchamiam? – codedude

Odpowiedz

32

Trzeba zmienić seed.

int main() { 

    srand(time(NULL)); 
    cout << (rand() % 101); 
    return 0; 
} 

srand siew rzeczą jest prawdziwe także dla kodu c językowej.


Zobacz także: http://xkcd.com/221/

5

Nie jesteś wysiewu numer.

użyj:

#include <iostream> 
#include <ctime> 

using namespace std; 

int main() 
{ 
    srand(static_cast<unsigned int>(time(0))); 
    cout << (rand() % 100) << endl; 
    return 0; 
} 

Wystarczy tylko do materiału siewnego go chociaż raz. Zasadniczo nie należy wysiewać każdej liczby losowej.

5

srand() zasadza generator liczb losowych. Bez nasienia generator nie jest w stanie wygenerować liczb, których szukasz. Dopóki potrzeba liczb losowych nie jest krytyczna z punktu widzenia bezpieczeństwa (na przykład jakakolwiek kryptografia), powszechną praktyką jest wykorzystanie czasu systemowego jako materiału siewnego przy użyciu funkcji time() z biblioteki <ctime> jako takiej: srand(time(0)). Spowoduje to zarzucenie generatora liczb losowych wraz z czasem systemowym wyrażonym jako uniksowy znacznik czasu (tj. Liczba sekund od daty 1/1/1970). Następnie można użyć rand(), aby wygenerować liczbę pseudolosową.

Oto cytat z duplicate question:

Powodem jest to, że liczba losowa wygenerowana z funkcji rand() nie jest rzeczywiście losowe. To po prostu transformacja. Wikipedia daje lepsze wyjaśnienie znaczenia generator liczb losowych pseudolosowych: deterministyczny : . Za każdym razem, gdy wywołujesz rand(), bierze on ziarno i/lub ostatnie wygenerowane liczby losowe (standard C nie określa użytego algorytmu , chociaż C++ 11 ma udogodnienia do określania popularnych algorytmów), uruchamia matematyczną operację na tych liczbach i zwraca wynik. Więc jeśli stan początkowy jest taki sam za każdym razem (tak, jak gdybyś nie zadzwonił do srand z prawdziwie liczbami losowymi ), zawsze otrzymasz te same "losowe" liczby.

Jeśli chcesz wiedzieć więcej, można przeczytać:

http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/

http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/

9

Do czego są również warto tylko generowanie liczb od 0 do 99 (włącznie) . Jeśli chcesz wygenerować wartości od 0 do 100, potrzebujesz.

rand() % 101 

oprócz wywoływania srand() jak wspomniano przez innych.

+0

dobry punkt. To musi być warte wygranej :) – codedude

+0

Również liczby nie będą rozkładane równomiernie, ponieważ jest mało prawdopodobne, że Rand zwróci liczby równomiernie rozłożone na dokładnej liczbie 101. – jcoder

3

losowe funkcje, takie jak Borland kompilator

using namespace std; 

int sys_random(int min, int max) { 
    return (rand() % (max - min+1) + min); 
} 

void sys_randomize() { 
    srand(time(0)); 
} 
Powiązane problemy