Das du das "Random zufall = new Random()" vor die Schleifen setzen musst, weißt du jetzt ja schon.
Ich versuche dir zu erklären warum das so ist.
Die Random Klasse ist nicht darauf begrenzt, dir nur eine Zufallszahl zu geben, sondern beliebig viele.
Das heißt, die Klasse Random brauchst du nur einmal definieren, und kannst daraus beliebig viele Zufallszahlen bekommen
Random zufall = new Random();
int z1 = zufall.Next(1, 200); // erste Zufallszahl aus Random
int z2 = zufall.Next(1, 200); // zweite Zufallszahl aus Random
....
int zx = zufall.Next(1, 200); // x-te Zufallszahl aus Random
Eine Eigenschaft der Random Klasse ist es, dass sie deterministisch ist. Das heißt, dass du bei gleichem Startwert (seed), auch die gleiche Zufallszahlenreihe raus bekommst.
Diesen Startwert, kannst du selbst bestimmen. Falls du ihn nicht selbst bestimmst, wird indirekt für dich ein Startwert definiert. Bei der Random Klasse in C# ist dieser Startwert die aktuelle Uhrzeit, auf die Sekunde genau.
Random zufall1 = new Random(); // Indirekter Startwert = aktuelle Zeit in Sekunden
Random zufall2 = new Random(4711); // Direkter Startwert = 4711
Wichtig zu verstehen ist, dass du im zweiten Fall, jedesmal wenn du dein Programm startest immer dieselben Zufallszahlen rausbekommst, wenn du Next(...) ausführst.
Warum bei dir jetzt so häufig immer dieselbe Zufallszahl rauskommt hat damit zu tun, dass du durch den Indirekten Startwert (aktuelle Zeit in Sekunden) innerhalb einer Sekunde auch immer denselben Startwert definierst, und du dadurch mit Next auch immer dieselbe Nächste Zufallszahl rausbekommst. Erst wenn eine Sekunde vergangen ist, hast du auch einen neuen Startwert und bekommst damit neue Zufallszahlen raus
Hier ein Beispiel:
// aktuelle Zeit in Sekunden = 1597990411
Random zufall = new Random(1597990411);
zufall.Next(1, 200); // erste Zufallszahl mit Startwert 1597990411
Random zufall = new Random(1597990411);
zufall.Next(1, 200); // erste Zufallszahl mit Startwert 1597990411
// du erhälst jetzt dieselbe Zufallszahl wie beim ersten mal, da du zweimal mit dem Startwert 1597990411 die erste Zufallszahl ermittelt hast
// eine Sekunde ist vergangen, aktuelle Zeit ist jetzt 1597990412
Random zufall = new Random(1597990412);
zufall.Next(1, 200); // erste Zufallszahl mit Startwert 1597990412
// jetzt bekommst du, da du einen neuen Startwert hast, auch eine neue Zufallszahl als erste Zufallszahl
Dadurch, dass du die Random Klasse in der Schleife immer neu definierst, bekommst du mit Next() immer nur die allererste Zufallszahl mit deinem Startwert. Und solange ebene keine neue Sekunde anbricht, ist die allererste Zufallszahl immer dieselbe Zufallszahl wie die allererste Zufallszahl aus dem vorhergehenden Durchlauf.
Es ist jetzt etwas länger geworden, aber ich hoffe du verstehst jetzt etwas besser, warum du das Ergebnis bekommst, das du bekommen hast.