Ich muss Zahlen im Bereich [-100; +2000] in C++. Wie kann ich das mit Rand machen, wenn nur positive Zahlen verfügbar sind? Gibt es schnelle Wege?Zufällige und negative Zahlen
Antwort
erzeugen eine Zufallszahl zwischen 0 und 2100 dann 100.
Eine schnelle Google-Suche eine decent looking article on using Rand(). aufgedreht subtrahieren Es enthält Codebeispiele für die am Ende des Artikels mit einem bestimmten Bereich zu arbeiten.
Können Sie eine Zahl von 0-2100 erzeugen und 100 subtrahieren?
Generieren eine Zufallszahl zwischen 0 und 2100, und subtrahieren 100.e
Hier ist der Code ist.
#include <cstdlib>
#include <ctime>
int main()
{
srand((unsigned)time(0));
int min = 999, max = -1;
for(size_t i = 0; i < 100000; ++i)
{
int val = (rand()%2101)-100;
if(val < min) min = val;
if(val > max) max = val;
}
}
Derzeit meine C++ Syntax ist ein wenig rostig, aber Sie sollten eine Funktion schreiben, die zwei Parameter nimmt: size
und offset
.
Sie erzeugen also Zahlen mit dem angegebenen size
als Maximalwert und fügen danach den (negativen) Offset hinzu.
würde die Funktion wie folgt aussehen:
int GetRandom(int size, int offset = 0);
und würde mit in Ihrem Fall aufgerufen werden:
int myValue = GetRandom(2100, -100);
In C++ 0x sie diese verbessern wird eine bessere Unterstützung für sie mit einem zu schaffen, Standardbibliothek.
können Sie die Zufallsfunktionen C++ TR1 verwenden erzeugen Zahlen in der gewünschten Verteilung.
std::random_device rseed;
std::mt19937 rng(rseed());
std::uniform_int<int> dist(-100,2100);
std::cout << dist(rng) << '\n';
Für diejenigen ohne TR1 ist boost :: random ziemlich nah. – MSalters
Dies wird keine gleichmäßige Verteilung geben! Auch das Finden des Minimums und Maximums von 100000 solcher Zahlen ist für die Frage nicht relevant. – darklon
Auch wenn "val" jedes Mal '-100' war, wäre das resultierende' max' falsch. Dito für Minimum. –
@Cornelius, @Ben: Wen interessiert das? Es ist nur eine Demo. Wenn ich nur '(rand()% 2101) -100' gepostet hätte, wäre das besser als ein kompilierbares, lauffähiges Beispiel gewesen? Bitte. –