Random Klasse
-
mh für mich macht der contruktor nicht viel sinn...
erstens: RAND_MAX ist eine recht grosse zahl, die zu übersteigen ist, naja, etwas ungewöhnlich wie ich finde
zweitens: wenn sie nicht überboten wird, apssiert ausser dem initialisieren von rand nix (srand(12) oO)
drittens: wenn doch, dann kann man sich die while schleife sparen, das wird zu:
Random::Random(int r = -1) { max_range = r; fill_mask = 0; fill_bits = 0; /* determine no. of bits required */ if (max_range > RAND_MAX) { int req_padding = (max_range / RAND_MAX); int cur_padding = 1; cur_padding = cur_padding << req_padding; fill_mask = fill_mask << req_padding; fill_mask += req_padding; fill_bits = req_padding; } srand (12); }
-
julchatt schrieb:
ok, danke!!!! Wenn r ein Defaultparameter ist und in der Funktion dieser Defaultparameter dem max_range übergeben wird...dies verstehe ich nicht so ganz, wozu wird es gemacht? Ich bin ziemlich neu in C++, muss noch viel üben...
Wenn du dich fragst, wozu das guit ist: Sollte das nicht dabei gestanden haben, wo du den Code her hast?
Von dem was ich so sehe, soll hier wohl ein Wrapper um den Zufallsgenerator erstellt werden, der ganzzahlige Zufallszahlen in einem bestimmten Wertebereich zieht. Dies ist solange ziemlich einfach, solange der Wertebereich < RAND_MAX ist (und man nicht auf einer perfekten Gleichverteilung besteht, sondern sich mit einer sehr sehr guten zufrieden gibt). Wenn der Wertebereich größer wird (es gibt durchaus noch Implementierungen mit RAND_MAX == 2 hoch 16), muss man mehrere Zahlen ziehen und diese zusammenfrickeln. Dein Programmierer hat sich hier ein, wie ich finde unnötig kompliziertes, Schema ausgedacht, bei dem die gezogenen Zahlen mittels ein bisschen Bitmanipulation auf die richtige Länge gestutzt und dann zusammengesetzt werden. Im Konstruktor berechnet er, wie die Bitmaske die er zum Zurechtschneiden benutzt genau aussehen muss. (Ich bin mir übrigens nicht ganz sicher, ob das wirklich richtig ist, was er da tut. Das ist so wirr programmiert.)
Den Code solltest du dir aber nicht als Vorbild nehmen. Wie schon von mehreren Leuten gesagt wurde, ist er ziemlich schlecht, der Programmierer hatte nicht viel Ahnung, weder von C++ noch allgemein. Es sieht sehr danach aus, als ob hier sehr viel "premature optimization" benutzt wurde, da der Programmierer wohl irgendwann mal gehört hat, dass Zufallszahlengeneratoren (auch) anhand ihrer Geschwindigkeit verglichen werden. Dadurch wurde der Code unnötig umständlich. Ich würde ganz stark da drauf tippen, dass das Resultat wesentlich langsamer ist, als eine naivere Implementierung.
-
)))) ja, kann sein...aber diesen Code habe ich von dem Professor...damit muss ich dann arbeiten)) ...Frage: wie erzeuge ich dann in main die Zufallszahlen? Hier meine Lösung halbwegs...
#include<iostream> #include<fstream> #include<ctime> #include<string> #include<time.h> #include "Random.h" using namespace std; int n1=100000, n2=1000000, n3=5000000; int main(int argc, int *argv[]) { clock_t start,end; int ran; Random *zufallszahlen1 = new Random(n1); Random *zufallszahlen2 = new Random(n2); Random *zufallszahlen3 = new Random(n3); //zufallszahlen1.give(); //zufallszahlen2.give(); //zufallszahlen3.give(); ifstream unsort_1, unsort_2, unsort_3; unsort_1.open("unsort_1.txt"); unsort_2.open("unsort_2.txt"); unsort_3.open("unsort_3.txt"); unsort_1.clear(); unsort_2.clear(); unsort_3.clear(); ofstream sortiert_1, sortiert_2, sortiert_3; sortiert_1.open("sortiert_1.txt"); sortiert_2.open("sortiert_2.txt"); sortiert_3.open("sortiert_3.txt"); sortiert_1.clear(); sortiert_2.clear(); sortiert_3.clear(); if(unsort_1.is_open()!=true || unsort_2.is_open()!=true || unsort_3.is_open()!=true){ cerr<<"Datei zum Schreiben von Random kann nicht geoeffnet werden!"<<endl; return 1; } if(sortiert_1.is_open()!=true || sortiert_2.is_open()!=true || sortiert_3.is_open()!=true){ cerr<<"Datei zum Schreiben von sortierten Zahlen kann nicht geoeffnet werden"<<endl; return 1; } while(!unsort_1.eof()){ for(int i=0; i<n1; i++){ ran = n1.give(); unsort_1 << ran<<; } } return 0; }
-
Der Code stand im Skript, aber erklärt was da garnichts. Und ich will ja verstehen was da abläuft.
-
julchatt schrieb:
Der Code stand im Skript, aber erklärt was da garnichts. Und ich will ja verstehen was da abläuft.
Lauf weg. Schnell.
Dies ist ganz übles C++. Praktisch alles ist falsch gemacht, was man falsch machen kann. Es compiliert noch nicht einmal. Von diesem Mann kannst du nichts lernen, außer wie man es nicht macht. Wenn du den Kurs fortsetzt, wirst du dich auf Jahre hinaus selber schädigen.
Es gibt sicherlich auch noch andere Sachen, die du an deiner Hochschule alternativ machen kannst. Dies jedenfalls solltest du vermeiden.
-
naja, ich habe bei dem Prof Algorithmen...ist meine Code bzw. meine Main Funktion halbwegs richtig...das Programm mekert bei:
while(!unsort_1.eof()){
for(int i=0; i<n1; i++){
ran = n1.give();
unsort_1 << ran<<;
}
}irgendetwas mache ich falsch...
-
julchatt schrieb:
irgendetwas mache ich falsch...
Ja. Definitiv. Du benutzt z.B. keine cpp-Tags. Außerdem ist "das Programm mekert" so ungenau wie es nur sein kann. Lies dir bitte mal den Link in meiner Signatur durch, besonders den Punkt zur präzisen Fragestellung.
-
Ok, ich mache Grammatikfehler...meine Frage bezieht sich auf die Random-Klasse.
Ich muss eine .txt Datei erzeugen und diese mit Zufallszahlen befüllen. Wie man sieht habe ich Schwierigkeiten mit der Umsetzung in der main()...deshalb bin ich ja auch in diesem Forum, um Euch, die Profis, für die es alles easy ist, zu fragen...
-
Random rnd(10); cout << rnd.give();War es das, was du wissen wolltest?
Der Rest der Schwierigkeiten, die du vermutlich hast, liegt, kurz gesagt, da dran, dass du nicht gut C++ kannst. Falls du die obige main geschrieben haben solltest, dann bezieht sich mein Kommentar über die Fähigkeiten deines Profs natürlich auf dich. Was auch ok ist, da du ja selber noch der Lernende bist und deinen Stil nicht lehren wirst.
Die Frage ist bloß, wo man anfangen soll. Du scheinst wirklich von Anfang an nicht aufgepasst zu haben. Schon die includes sind falsch. Dazu noch globale Variablen, die vermutlich Konstanten sein sollen. Dann geht's weiter mit total sinnlosen unbenutzten Variablen. Dann Variablen die ohne Grund mit new angelegt werden (früher mal Java gemacht?). Dann lauter Mystizismus im Umgang mit Streams, der zeigt, dass du mal ein paar Sachen mit der C++-Ein-/Ausgabe gesehen, aber nicht verstanden hast. Und noch ein paar Grammatikfehler (nicht Deutsch, sondern C++), die vermutlich zu deinem "das Programm mekert" führen.
Ich möchte dich nicht beleidigen (angeblich denken einige Leute, der Umgangston hier im Forum wäre zu hart), sondern das obige ist eine objektive Aufzählung des Ist-Zustandes. Die fehlen sowohl sprachliche Grundlagen als auch die nötige Sorgfalt. Im Internet Codebeispiele suchen, zusammenkopieren und ein bisschen zu verändern ist nicht Programmieren!
Du müsstest noch einmal ganz zu den Grundlagen von C++ zurück. Guck mal hier:
http://www.c-plusplus.net/forum/251551
Ob das zeitlich für dich in Frage kommt, musst du wissen. Jedenfalls liefe jede andere Beantwortung deiner Fragen zur main da drauf hinaus, dass dir jede Woche jemand deine Hausaufgaben komplett schreibt, was nicht in Frage kommt.
-
Ja, ich weiß, ich muss mir erst die Grundlagen aneignen...Trotzdem Danke für die Hilfe und die Info ...
