srand, Vektorklasse, Klasse



  • Hallo,

    ich programmiere im Moment an einem Programm, das ein neuronales Netzwerk beinhaltet, welches trainiert werden muss. Aber zu meinem Problem.

    Ich habe mir eine Klasse Neuron geschrieben, deren constructor "Zufallszahlen" benötigt, die ich mir im Moment mit der Randomfunktion erzeuge:

    Neuron::Neuron()
    {
    weight_1=rand()%9;
    }
    

    Innerhalb des Programmes muss ich mir dynamisch Objekte vom Typ Neuron erzeugen, was ich mit Hilfe der Vektorklasse mache:

    srand(time(NULL)); // initialize randomnumber generator
    vector<Neuron> vecneuron; //generates vector for neurons 
    Neuron neuron; 
    
    //generate the different neurons    
    for(int i=0;i<=5;i++)
    {
    vecneuron.push_back(neuron); 
    }
    

    Die srand-Funktion initialisiert den randomnumber Erzeuger.
    Mein Problem ist nun, dass die erzeugte Zufallszahl für jeden der hier 5 erzeugten Vektoren gleich ist!
    Wie kann man dieses Problem umgehen.

    Vielen Dank schon einmal!


  • Administrator

    Führe srand nur einmal beim Start deines Programmes aus und nicht immer erneut. Wahrscheinlich geht die Erstellung so schnell, dass jedesmal der gleiche Seed gesetzt wird, da keine über die Funktion time messbare Zeit vergangen ist.

    Grüssli



  • srand wird doch nur einmal am Start ausgeführt.

    Grüße Matthias


  • Administrator

    Mathias123456 schrieb:

    srand wird doch nur einmal am Start ausgeführt.

    Achso, dann habe ich mich von deinem letzten Satz verwirren lassen. Du hast gesagt, dass du 5 Vektoren erzeugst. Ich dachte, dass der präsentierte Code eine Funktion ist, welche du 5 mal aufrufst 😉

    Aber dann meintest du in dem Fall, dass die 5 Neuronen Objekte den gleichen Zufallswert beinhalten? Aber das liegt doch auf der Hand! Du kopierst 5 mal das gleiche Objekt in den Vektor rein!

    Grüssli



  • Oh schlecht ausgedrückt

    Naja ich verstehe das so:
    Ich vegrößere den Vektor immer um ein Feld und ich dachte bei der jeweiligen Vektorvergrößerung würde der Konstruktor aufgerufen und damit auch den neuen random number genertator..

    Aber wenn dem nicht so ist, eine Idee, wie das Problem umgangen werden kann?

    Grüße


  • Administrator

    Ehm, da scheint ein grundlegendes Verständnis in C++ zu fehlen? Was 5 mal aufgerufen wird, ist der Kopierkonstruktor, weil du das Objekt 5 mal kopierst und die 5 Kopien in den std::vector legst. Wenn du jedesmal ein neues Objekt haben möchtest, dann lege halt jedesmal ein neues Objekt an:

    srand(time(NULL)); // initialize randomnumber generator
    vector<Neuron> vecneuron; //generates vector for neurons
    
    //generate the different neurons
    for(int i = 0; i < 5; i++) // im übrigens nicht <= 5, sondern < 5, sonst hast du 6 Objekte.
    {
      vecneuron.push_back(Neuron()); // <- immer wieder ein neues Objekt erzeugen und einfügen.
    }
    

    Grüssli



  • Danke für den Tipp, arbeite das erstemal mit der Vektorklasse und habe mir nicht wirklich durchgelesen, wie die Funktionen arbeiten...

    Mache es nun einfach so:

    for(int i=0;i<=5;i++)
    {
    Neuron neuron; 
    vecneuron.push_back(neuron); 
    }
    

    ^^Das mit der 5 war nur ein Fehler beim reduzieren, ist in Wikrlichkeit alles ein bischen komplexer und größer, wollte euch/dich aber nicht mit mehr belästigen 😉

    Tausend Dank nochmal für die schnelle Hilfe 🙂


  • Administrator

    Matthias123456 schrieb:

    Danke für den Tipp, arbeite das erstemal mit der Vektorklasse und habe mir nicht wirklich durchgelesen, wie die Funktionen arbeiten...

    😕 Naja, was macht wohl ein push_back , wenn man ihm ein Objekt übergibt? Doch sicher nicht das Objekt ignorieren und neue Objekte erstellen... 😕

    Naja ...

    Matthias123456 schrieb:

    Tausend Dank nochmal für die schnelle Hilfe 🙂

    np, gerngeschehen.

    Grüssli


  • Mod

    Die temporäre Variable 'neuron' kannst du dir auch sparen, wie Dravere das schon gezeigt hat.


Anmelden zum Antworten