C# Probelm z dynamicznym tworzeniem obiektów

0

W głownym pliku mam :


Class1 c;
            for (int i = 0; i <= 3; i++)
            {

                c = new Class1(i);
                c.Obliczenia1();
                Populacja.Add(c);
            }

public Class1()
        {
            GenerujMacierz();
        }

        public Class1(int nrosobnika)
        {
            GenerujMacierz();
            this.nrosobnika = nrosobnika;
        }

W Class1 jest jeszcze funckja generujaca wartość "wydobycie" i jeśli w tej funkcji umieszcze jakikolwiek MessageBox.Show to każdy "c" jest inny natomiast jeśli tego niezrobie wartość "wydobycie" jest zawsze taka sama wie ktoś dlaczego tak się dzieje?

Jak ustawie Breakpoint w edytorze i cały debug przejdzie to tez są dobre rózne wartości a jak breakpoint NIE MA to wszystko takie samo...

0

Jaka wartość "wydobycie"? Czegoś takiego tu nie ma.

0

A może funkcja generująca wydobycie, generuje je tak samo dla wszystkich obiektów? :)
potrzeba nam wiecej kodu, żeby coś wywróżyć

0

Tutaj jest funkcja która robi obliczenia, nawet jak dodałem System.Threading.Thread.Sleep(10); to zdarza się ze dwa obiekty mają taka sama wartość optimum (optimum = wydobycie )


  public void Obliczenia1(double modyfikator = 1)
        {
            //MessageBox.Show("");
            bool go = false;
            double wynik, posteplosowy;
            Random PosLos = new Random();
            for (int i = 0; i <= (this.dane.Length / 10)-1; i++)
            {
                go = false;
                do{
                posteplosowy = PosLos.NextDouble();
                wynik = (posteplosowy * modyfikator)*this.dane[i,6] +  this.dane[i,5];
                if ((wynik >= (this.dane[i, 5] - this.dane[i, 6])) && ((wynik <= (this.dane[i, 5] + this.dane[i, 6]))))
                {
                    //MessageBox.Show("Test" + wynik);
                    this.dane[i,7] = posteplosowy;
                    this.dane[i, 8] = this.dane[i, 0] * this.dane[i, 2] * (wynik * 21) * this.dane[i, 3] * this.dane[i, 4];
                    this.dane[i, 9] = Math.Round((this.dane[i, 1] / (wynik * 21)));
                    go = true;
                    wynik = 0;
                }
            }
                while (go == false);
            }
            //Tutaj rozpoczyna się obliczanie wydobycia calosciowego a takze okreslanie funkcji F
            for (int q = 0; q <= (this.dane.Length / 10) - 1; q++) // Petla dla 9 scian. 90/10 = 9 
            {
                if (q == 0 || q == 1 || q == 2) // Sciana 1 2 3
                {

                    for (int w = 0; w <= this.dane[q, 9]; w++)
                    {
                        if (w == 0)
                        {
                            kompleks1.Add(0);
                            kompleks1.Add(0);
                        }
                        kompleks1.Add(this.dane[q,8]);
                    }
                }

                if (q == 3 || q == 4 || q == 5) // Sciana 4 5 6
                {
                    for (int w = 0; w <= this.dane[q, 9]; w++)
                    {
                        if (q== 3 && w == 0)
                        {
                            kompleks2.Add(0);
                            kompleks2.Add(0);
                            kompleks2.Add(0);
                            kompleks2.Add(0);
                        }
                        if ((q == 4 || q == 5) && w == 0)
                        {
                            //MessageBox.Show("Dziala funkcja 2x");
                            kompleks2.Add(0);
                            kompleks2.Add(0);

                        }
                        kompleks2.Add(this.dane[q, 8]);
                    }
                }

                if (q == 6 || q == 7 || q == 8) // Sciana 7 8 9
                {
                    for (int w = 0; w <= this.dane[q, 9]; w++)
                    {
                    if ((q == 7 || q == 8) && w == 0)
                    {
                        kompleks3.Add(0);
                        kompleks3.Add(0);

                    }
                    kompleks3.Add(this.dane[q, 8]);
                    }

                }
            }
            // Obliczono 3 kompleksy scianowe nastepnie sumujemy wydobycia w poszczegolnych miesiacach we wszystkich kompleksach
            int[] listalisty = new int[3];
            listalisty[0] = kompleks1.Count;
            listalisty[1] = kompleks2.Count;
            listalisty[2] = kompleks3.Count;
            //MessageBox.Show("" + kompleks1.Count + " " + kompleks2.Count + " " + kompleks3.Count); 
            Array.Sort(listalisty);
            int[] sumymiesieczne = new int[listalisty[2]];
           // MessageBox.Show("" + listalisty[2]);
            for (int h = 0; h <= listalisty[2] - 1; h++)
            {
                if (listalisty[2] >= kompleks1.Count)
                { kompleks1.Add(0); }
                else if (listalisty[2] >= kompleks2.Count) { kompleks2.Add(0); }
                else if (listalisty[2] >= kompleks3.Count) { kompleks3.Add(0); }

                sumymiesieczne[h] = (Convert.ToInt32(kompleks1[h]) + Convert.ToInt32(kompleks2[h]) + Convert.ToInt32(kompleks3[h]));
            }

            for (int j = 12; j <= 36; j++)
            {

                optimum = optimum + Math.Pow(sumymiesieczne[j] - 150000, 2);
            }

            optimum = Math.Sqrt(optimum);
            System.Threading.Thread.Sleep(6 );

           //MessageBox.Show("Osobnik " + this.nrosobnika + " Postep:  " + optimum);

        }
0

Źle używasz obiektu Random. Tworzenie go przy każdym wywołaniu metody na nowo powoduje generowanie tych samych wyników. Zdefiniuj go jako statyczne pole klasy, a w swojej metodzie wywołuj tylko jego metody losujące.

Sprawa druga - Twoja funkcja jest bardzo długa i przez to nieczytelna. Dobrze by było, jakbyś podzielił ją na mniejsze.

0

Tak, zrobiłem i pomogło dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0