Ich benutze .NET, um ein künstliches Lebenprogramm zu schaffen, und ich benutze Pseudozufallsklasse C#, die in einem Singleton definiert wird. Die Idee ist, dass, wenn ich den gleichen Zufallszahlengenerator in der gesamten Anwendung verwende, ich den Seed nur speichern und dann von dem Seed neu laden könnte, um einen bestimmten interessanten Lauf neu zu berechnen.C# Zufallszahlengenerator, der in einem Zyklus stecken bleibt
Ich wollte auch eine Methode, die mir zwei verschiedene Zufallszahlen geben könnte.
public static Tuple<int, int> TwoDifferentRandomNumbers(this Random rnd, int minValue, int maxValue)
{
if (minValue >= maxValue)
throw new ArgumentOutOfRangeException("maxValue", "maxValue must be greater than minValue");
if (minValue + 1 == maxValue)
return Tuple.Create<int, int>(minValue, maxValue);
int rnd1 = rnd.Next(minValue, maxValue);
int rnd2 = rnd.Next(minValue, maxValue);
while (rnd1 == rnd2)
{
rnd2 = rnd.Next(minValue, maxValue);
}
return Tuple.Create<int, int>(rnd1, rnd2);
}
Das Problem ist, dass manchmal rnd.Next(minValue,maxValue
immer minValue
zurückgibt. Wenn ich an dieser Stelle einen Haltepunkt einstelle und versuche, ein Double zu erstellen und auf rnd.NextDouble()
zu setzen, wird 0.0 zurückgegeben. Wer weiß, warum das passiert?
Ich weiß, dass es ein Pseudozufallszahlengenerator ist, aber ehrlich gesagt, ich hatte nicht erwartet, dass es bei 0 sperren. Der Zufallszahlengenerator wird von mehreren Threads zugegriffen ... könnte dies die Ursache des Problems sein ?
EDIT: Danke, das Problem endete Threadsicherheit.
Dies ist die neue Version der Klasse.
public sealed class RandomNumberGenerator : Random
{
private static Random _global = new Random();
[ThreadStatic]
private static Random _localInstance;
RandomNumberGenerator()
{
}
public static Random Instance
{
get
{
Random inst = _localInstance;
if (inst == null)
{
int seed;
lock (_global) seed = _global.Next();
_localInstance = inst = new Random(seed);
}
return _localInstance;
}
}
}
Whoops, ich hatte diesen Postantwortfenster ein bisschen zu lange offen gelassen, +1 ... genau das wollte ich sagen! –
Danke, du warst genau richtig. Ich habe deinen Kommentar als Antwort akzeptiert, um dir noch mehr Karma zu geben: P Auch, danke, dass du mir von dem anderen Problem mit mehreren Threads erzählt hast, es kam mir nicht in den Sinn! –