Mein angegebener Code ist der problematische Teil des ursprünglichen Programms. Er tauscht zwei Elemente von myArray zufällig N mal und in T Anzahl von Schleifen. Das Programm tut, was es soll, aber nachdem er "return 0" gedrückt hat, zeigt es die Fehler-Massage von "program.exe hat aufgehört zu arbeiten". Die Debug-Ausgabe zeigtShuffle-Elemente von Array: stack-basierter Pufferüberlauffehler
Warum zeigt das Programm Fehler, nachdem seine Arbeit erledigt ist? Wie kann ich das beheben?
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
const int N = 10000;
const int T = 100;
srand((unsigned)time(0));
bool myArray[N] ;
bool temp = true;
int save1 = 0;
int save2 = 0;
//initializing myArray
for (int index = 0; index < N/2; index++) {
myArray[index] = false;
}
for (int index = N/2; index < N; index++) {
myArray[index] = true;
}
for (int index = 0; index < T; index++) {
for (int index1 = 0; index1 < N; index1++) {
save1 = int(N*rand()/RAND_MAX);
save2 = int(N*rand()/RAND_MAX);
temp = myArray[save1];
myArray[save1] = myArray[save2] ;
myArray[save2] = temp;
}
}
cout<<" Press any key to exit...";
cin.get();
return 0;
}
EDIT: Ich hatte von 0 bis (N-1) ganze Zufallszahl zu erzeugen. Durch den Aufruf des N-ten Standorts in myArray wurde das Problem verursacht.
Aber keine der folgenden Methoden generiert zufällige Integer einheitlich.
save1 = int((N-1)*rand()/RAND_MAX);
noch
save1 = int(N*rand()/(RAND_MAX+1));
Es gibt einen schönen video auf das Problem dieser Methode. Es gibt auch das Problem des Überlaufs, verursacht durch (N-1)*rand()
, wie Mic und Bob__ darauf hingewiesen haben.
Diese Modulo-Methode ist auch sehr ineffizient für große Bereich der zufälligen Ganzzahl (überprüfen Sie diese article für Details). Meine beste Chance, einheitliche Zufallszahlen zu erzeugen, ist die folgende Methode (entlehnt aus dem Artikel).
while(true)
{
int value = rand();
if (value < RAND_MAX - RAND_MAX % range)
return value % range;
}
Auch Anordnungselemente für Shuffling ist es am besten random_shuffle
Funktion oder Fisher–Yates shuffle
für eine optimale Leistung zu verwenden.
Es ist das Bat-Signal für das Schreiben über das Ende des Arrays. Und sicher, Rand() tut nicht, was Sie denken, dass es tut. Dieser Code ist im Allgemeinen ziemlich falsch, es ist nicht wirklich zufällig, bitte google "C++ fisher yates shuffle". –
'rand()/RAND_MAX' führt eine * ganze Zahl * Division zu 0 (oder 1 wenn rand() RAND_MAX zurück) –
Wenn RAND_MAX groß ist, wird die Berechnung N * rand() überlaufen und Sie werden seltsame Indexwerte erhalten. Sie können die Modularithmetik verwenden oder in double konvertieren. Google stdlib rand für Beispiele zur Verwendung von rand() – Mic