Metoda statyczna zwraca zawsze tę samą wartość

Metoda statyczna zwraca zawsze tę samą wartość
D2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Witam, mój problem prezentuje się następująco: chcę stworzyć listę złożoną z obiektów klasy "Patient", która wygląda tak:

Kopiuj
class Patient
    {

        public Patient(int age, string name, string surname)
        {
            Age = age;
            Name = name;
            Surname = surname;

        }

        public string Name { get; set; }
        public string Surname { get; set; }
        public int Age { get; set; }
    }

Listę chcę stworzyć w ten sposób:

Kopiuj
static void Main(string[] args)
        {
            
            List<Patient> PatientList = new List<Patient>();
            Random rnd = new Random();

            for (int i = 0; i < 25; i++)
            {
                PatientList.Add(new Patient(rnd.Next(13,81), Generator.CreateName(), Generator.CreateSurname() ));
            }      
        }

W klasie Generator posiadam dwie metody statyczne. Problem polega na tym, że mimo tego, że po uruchomieniu programu wszyscy pacjenci nazywają się zawsze tak samo. Innymi słowy metody losują imiona i nazwiska tylko raz podczas uruchamiania.
Co jest tego przyczyną? Jak sprawić, żeby podczas dodawania kolejnego pacjenta w pętli, metody

Kopiuj
CreateName()

i CreateSurname()

Kopiuj
 zwracały różne wartości?
fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

to moze podasz kod tych metod? Tu wrozbitow nie znajdziesz ;)

D2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

@fasadin no tak, gdzie ja mam głowę

Kopiuj
 public static string CreateName()
        {
            string[] NameList = new string[20];

            NameList[0] = "Jan";
            NameList[1] = "Paweł";
            NameList[2] = "Mateusz";
            NameList[3] = "Piotr";
            NameList[4] = "Kamil";
            NameList[5] = "Łukasz";
            NameList[6] = "Dawid";
            NameList[7] = "Maciej";
            NameList[8] = "Marek";
            NameList[9] = "Karol";
            NameList[10] = "Romuald";
            NameList[11] = "Wiktor";
            NameList[12] = "Tobiasz";
            NameList[13] = "Stefan";
            NameList[14] = "Andrzej";
            NameList[15] = "Jarosław";
            NameList[16] = "Adam";
            NameList[17] = "Antoni";
            NameList[18] = "Michał";
            NameList[19] = "Przemysław";

            Random rnd = new Random();

            return NameList[rnd.Next(NameList.Length)];
		}

	public static string CreateSurname()
        {

            string[] FirstSyllable = new string[20];

            FirstSyllable[0] = "No";
            FirstSyllable[1] = "Ka";
            FirstSyllable[2] = "Le";
            FirstSyllable[3] = "Dąb";
            FirstSyllable[4] = "Kra";
            FirstSyllable[5] = "Hry";
            FirstSyllable[6] = "Ma";
            FirstSyllable[7] = "Bo";
            FirstSyllable[8] = "Wiś";

            string[] MiddleSyllable = new string[20];

            MiddleSyllable[0] = "wal";
            MiddleSyllable[1] = "niew";
            MiddleSyllable[2] = "wan";
            MiddleSyllable[3] = "dow";
            MiddleSyllable[4] = "zur";
            MiddleSyllable[5] = "niewie";
            MiddleSyllable[6] = "brąw";
            MiddleSyllable[7] = "rzań";

            string[] LastSyllable = new string[20];

            LastSyllable[0] = "ski";
            LastSyllable[1] = "cki";
            LastSyllable[2] = "wak";
            LastSyllable[3] = "ak";
            LastSyllable[4] = "ik";
            LastSyllable[5] = "ur";

            string surname = null;

            Random rnd = new Random();
            Random toBe = new Random();

            surname += FirstSyllable[rnd.Next(10)];

            if (toBe.Next(2) == 1)
            {
                surname += MiddleSyllable[rnd.Next(8)];
            }

            surname += LastSyllable[rnd.Next(7)];

            return surname;

		}

Metody to na razie małe potworki, ale chodzi o sam mechanizm działania.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
5

To dlatego, że obiekty Random tworzysz sobie w każdej metodzie na nowo. To co wylosuje ten obiekt zależy od aktualnego czasu, ponieważ metody wywołujesz bardzo szybko, to za każdym razem nowy obiekt Random losuje tą samą wartość.

Żeby to miało sens, jedna klasa powinna mieć jedno statyczne pole typu Random.

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
4

Dlatego sie tak dzieje bo w kazdej metodzie tworzysz od nowa

Kopiuj
Random rnd = new Random();

stworz raz obiekt random i go po prostu uzywaj zamiast tworzyc od nowa

edit. @somekind byl pierwszy

D2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

@fasadin @somekind Działa, wielkie dzięki, Panowie :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.