Random ist nicht gleich Random. Das ist das einzige, das klar ist. Ich denke in jeder Programmiersprache gibt es eine Funktion zum erstellen von Zufallszahlen. In C# ist das die Klasse Random mit der Funktion Next. Hier mal ein einfaches Beispiel:

Random rnd = new Random();
Int32 value = rnd.Next(10);

„value“ bekommt damit einen Wert von 0 bis 9 (Der Parameter ist die ausschließende Obergrenze der Zahlenreihe)

Machen wir in diesem Zusammenhang ein kleines Beispiel:

static void Main(string[] args)
{
    Random rnd1 = new Random();
    Random rnd2 = new Random();

    for (int i = 0; i < 10; i++)
        Console.WriteLine(String.Format("{0} - {1}", rnd1.Next(10), rnd2.Next(10)));

    Console.ReadKey();
}

Es sollen also zwei Zufallszahlen pro Zeile ausgegeben werden. Aber jetzt kommt gleich der Schock. Das Ergebnis sieht nämlich alles andere als zufällig aus:

2 – 2
6 – 6
6 – 6
8 – 8

Eigentlich würde man doch hier erwarten, dass in jeder Zeile zwei unterschiedliche Zahlen stehen. Der Grund dafür ist aber relativ klar zu erklären. Random verwendet den aktuellen Timestamp zum Generieren der Zufallszahl. Da die zwei Instanzen von Random quasi zur gleichen Zeit angelegt werden, unterscheiden sich die Timestamps kaum von einander und man erhält dadurch in den meisten Fällen die gleichen Zahlen. Mit etwas Glück kann man es schaffen, dass die Zahlen wirklich mal abweichen, aber das ist eher unwahrscheinlich.

Es gibt eine recht einfache Lösung, wie man dieses Problem umgehen kann. Wenn man die Klasse Random verwendet, sollte man darauf achten, dass man nur eine Instanz davon anlegt und diese dann immer wieder verwendet. Damit bekommt man dann einigermaßen gute Zufallszahlen. Man sollte aber dabei im Hinterkopf halten, dass es sich nichts desto trotz immer noch nur um Pseudo-Zufallszahlen handelt.

Um echte Zufallszahlen zu erzeugen, müsste man schon tiefer in die Hardware gehen. Es gibt Möglichkeiten, um aus dem Rauschen im All Zufallszahlen zu erzeugen. Auch an Hand von irgendwelchen Luftpartikeln lassen sich Zufallszahlen erzeugen. Aber auf rein mathematischen Weg, wie das eben unsere Rechner machen, ist das eigentlich nicht möglich.

Es gibt aber zumindest bessere Möglichkeiten als die Klasse Random, auch wenn diese Möglichkeiten dann vielleicht umständlicher erscheinen, aber manchmal ist es einfach wichtig, dass man möglichst gute Zufallszahlen erhält. Eine dieser Möglichkeiten ist die Klasse RNGCryptoServiceProvider. Dieser liefert aber leider nur eine definierte Anzahl an Bytes zurück, so dass man diese Bytes erst in eine Zahl umwandeln muss. Mit einer entsprechenden Methode ist das dann aber kein Problem:

static int GenerateRandomNumber(int min, int max)
{
    RNGCryptoServiceProvider c = new RNGCryptoServiceProvider();
    // Ein integer benötigt 4 Byte
    byte[] randomNumber = new byte[4];
    // dann füllen wir den Array mit zufälligen Bytes
    c.GetBytes(randomNumber);
    // schließlich wandeln wir den Byte-Array in einen Integer um
    int result = Math.Abs(BitConverter.ToInt32(randomNumber, 0));
    // da bis jetzt noch keine Begrenzung der Zahlen vorgenommen wurde,
    // wird diese Begrenzung mit einer einfachen Modulo-Rechnung hinzu-
    // gefügt
    return result % max + min;
}