2015-12-10 7 views
6

Wie würden Sie eine Funktion erstellen, die eine Zufallszahl von 1 bis 25 Millionen generiert?C++ Zufallszahl von 1 bis zu einer sehr großen Anzahl (z. B. 25 Millionen)

Ich habe über die Verwendung von rand() gedacht, aber bin ich richtig im Denken, dass die maximale Anzahl, RAND_MAX ist = 32000 (da etwa)?

Gibt es einen Weg, der die Wahrscheinlichkeit, sehr niedrige Zahlen zu wählen, nicht verringert und die Wahrscheinlichkeit, hohe/mittlere Zahlen zu sammeln, nicht erhöht?

Edit: @Jamey D Methode funktioniert perfekt unabhängig von Qt.

+4

Sie können in die Dienstprogramme verwenden [ ' '] (http://en.cppreference.com/w/cpp/header/random), um dies zu tun. – NathanOliver

+0

['' 'RAND_MAX'''] (http://en.cppreference.com/w/cpp/numeric/random/RAND_MAX) ist implementierungsabhängig. Es ist garantiert, dass dieser Wert mindestens "32767" ist. – mepcotterell

+0

@Nathan das sollte eine Antwort sein –

Antwort

10

Sie könnte (sollte) verwenden die neue 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 ist auf dieser Seite nicht alt geworden, immer noch neu :) – LogicStuff

+0

@LogicStuff Im Vergleich zu der Zeit, die C++ hatte, würde ich sagen, dass es noch ziemlich neu ist: P –

+1

C++ 11 hat diese speziellen Bibliotheken von boost übernommen Dies ist also in Boost verfügbar, auch wenn Sie eine Implementierung verwenden. –

1

Werfen Sie einen Blick auf RAN3

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

Sie sollten in der Lage sein, zu bekommen, was Sie von ihm wollen.

Ran3 ist (zumindest als ich noch rechnergestützt arbeitete) schneller als rand() mit einer gleichmäßigeren Verteilung, obwohl das vor einigen Jahren war. Es gibt einen zufälligen ganzzahligen Wert zurück.

Zum Beispiel bekommen Sie den Quellcode aus den obigen Link:

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

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

Während dies die Frage theoretisch beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), die wesentliche Teile der Antwort hier und bieten den Link als Referenz. – NathanOliver

+1

Ja, ich habe mich beim Editieren für den Kompilierungscode entschieden. Es ist jetzt hoch.Wahrscheinlich würde ich die C++ 11 Antwort über die, die ich gab, empfehlen, es sei denn, Sie brauchen wirklich gute Zufallszahlen. – Ajwhiteway

+1

Im Allgemeinen können Sie die Modulo-Operation nicht verwenden, um das Intervall der Zufallszahlengenerierung zu skalieren. Die resultierende Verteilung wird ungleichmäßig. –

Verwandte Themen