2015-12-10 39 views
6

Jak utworzyć funkcję generującą losową liczbę od 1 do 25 milionów?C++ Losowa liczba od 1 do bardzo dużej liczby (np. 25 milionów)

Myślałem o użyciu rand(), ale mam rację myśląc, że maksymalna liczba, RAND_MAX jest = 32000 (tam o)?

Czy jest jakiś sposób obejścia tego, sposób, który nie zmniejsza prawdopodobieństwa pobrania bardzo niskich liczb i nie zwiększa prawdopodobieństwa wybierania liczb wysokich/średnich?

Edytuj: Metoda @Jamey D działała doskonale niezależnie od Qt.

+4

Można użyć narzędzi w [ ' '] (http://en.cppreference.com/w/cpp/header/random) aby to zrobić. – NathanOliver

+0

['' 'RAND_MAX'''' (http://en.cppreference.com/w/cpp/numeric/random/RAND_MAX) jest zależny od implementacji. Gwarantuje się, że ta wartość jest co najmniej "' '32767'''. – mepcotterell

+0

@Nathan, który powinien być odpowiedzią –

Odpowiedz

10

Mogłeś (należy) używać nowych C++ 11 std::uniform_real_distribution

#include <random> 

std::random_device rd; 
std::mt19937 gen(rd()); 

std::uniform_real_distribution<> distribution(1, 25000000); 

//generating a random integer: 
double random = distribution(gen); 
+0

C++ 11 nie pojawił się na tej stronie, wciąż nowy :) – LogicStuff

+0

@LogicStuff W porównaniu do czasu, w jakim było C++, powiedziałbym, że wciąż jest całkiem nowy: P –

+1

C++ 11 przejęło te konkretne biblioteki od wzmocnienia więc jest to dostępne nawet jeśli używasz implementacji. –

1

Wystarczy popatrzeć na ran3

http://www.codeforge.com/read/33054/ran3.cpp__html

powinny być w stanie uzyskać to, czego chcą od niego.

Ran3 jest (co najmniej, gdy nadal robiłem modelowanie komputerowe) szybszym niż rand() z bardziej jednolitym rozkładem, choć było to kilka lat temu. Zwraca losową liczbę całkowitą.

Na przykład, uzyskanie kodu źródłowego z linku powyżej:

int main() { 
    srand(time(null)); 

    int randomNumber = ran3(rand()) % 25000000; 
    int nextRandomNumber = ran3(randomNumber); 
} 
+2

Chociaż może to teoretycznie odpowiedzieć na pytanie, [byłoby lepiej] (// meta.stackoverflow.com/q/8259), aby dołączyć zasadnicze części odpowiedzi tutaj, i podać link dla odniesienia. – NathanOliver

+1

Tak, wybierałem edycję podczas oczekiwania na kompilację kodu. Teraz jest.Prawdopodobnie poleciłbyś odpowiedź w języku C++ nad tym, który dałem, chyba że potrzebujesz naprawdę dobrych liczb losowych. – Ajwhiteway

+1

Powszechnie nie można używać operacji modulo do skalowania przedziału generowania liczb losowych. Wynikowa dystrybucja staje się niejednolita. –