Jedes Mal, wenn Sie new Random()
er wird mit Hilfe der Uhr initialisiert. Das bedeutet, dass Sie in einer engen Schleife viele Male denselben Wert erhalten. Sie sollten einen einzigen Zufällig Instanz und verwenden Sie weiterhin Weiter über die dieselbe Instanz.
//Function to get a random number
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static int RandomNumber(int min, int max)
{
lock(syncLock) { // synchronize
return random.Next(min, max);
}
}
Bearbeiten (siehe Kommentare): Warum brauchen wir eine lock
hier?
Im Grunde genommen, Next
wird den internen Zustand des Random
Instanz. Wenn wir das gleichzeitig von mehreren Threads aus tun, können Sie pourrait "Wir haben das Ergebnis nur noch zufälliger gemacht", aber was wir tun, ist eigentlich Dies könnte die interne Implementierung zerstören, und wir könnten auch anfangen, dieselben Zahlen von verschiedenen Threads zu erhalten, was puede ein Problem sein - und vielleicht auch nicht. Die Garantie dessen, was intern geschieht, ist jedoch das größere Problem; denn Random
hace no keine Garantien für die Sicherheit von Threads geben. Es gibt also zwei gültige Ansätze:
- Synchronisieren, damit wir nicht von verschiedenen Threads aus gleichzeitig darauf zugreifen
- Verwenden Sie verschiedene
Random
Instanzen pro Thread
Beides kann in Ordnung sein; aber das Mutexing einer einzeln Instanz von mehreren Anrufern zur gleichen Zeit ist einfach zu viel des Guten.
Le site lock
erreicht den ersten (und einfacheren) dieser Ansätze; ein anderer Ansatz könnte jedoch sein:
private static readonly ThreadLocal<Random> appRandom
= new ThreadLocal<Random>(() => new Random());
dies ist dann pro Thread, so dass Sie nicht synchronisieren müssen.
27 Stimmen
Mit
new Random().Next((int)0xFFFF, (int)0xFFFFFF) % 256);
ergibt keine besseren "Zufallszahlen" als.Next(0, 256)
2 Stimmen
Sie finden vielleicht dieses NuGet-Paket hilfreich. Es bietet eine statische
Rand.Next(int, int)
Methode, die einen statischen Zugriff auf Zufallswerte ermöglicht, ohne Sperren oder das Problem der Wiederverwendung von Seeds zu verursachen