Hallo Community,
Wenn ich unter .NET eine Klasse Random instanziiere und einen Seed angebe erhalte ich immer die gleichen ("Zufalls-")Zahlen.
Mich würde mal interressieren wie es sich mit anderen Programmiersprachen/Bibliotheken verhält.
Angenommen ich erstelle einen Generator mit dem Seed 100: Bekomme ich unter .NET die gleichen Zahlen wie unter anderen Bibliotheken? Ist die Funktionsweise des Zufallsgenerators 'genormt'? Und wie funktioniert so ein Zufallsgenerator eigendlich?
Hintergrund:
Ich möchte Zufallszahlen generieren die sich bei Bedarf wiederholen sollen. Dabei wird .NET eingesetzt allerdings möchte ich mich nicht auf .NET festnageln. Evtl. gibts es alternative Möglichkeiten wie eine manuell festgelegte Zahlentabelle?
Hat jemand Wissen/Ideen/Anregungen zu diesen Thema?
Hallo Lector,
Bekomme ich unter .NET die gleichen Zahlen wie unter anderen Bibliotheken? Ist die Funktionsweise des Zufallsgenerators 'genormt'?
[...]
Ich möchte Zufallszahlen generieren die sich bei Bedarf wiederholen sollen.
Darauf sollte man sich lieber nicht verlassen - evtl. wird die Implementierung irgendwann einmal geändert.
Verwende lieber selbst implementierte Zufallsgeneratoren - diese kannst du auch in anderen Programmiersprachen nachimplementieren.
Auf Codeproject oder generell im Web sollten sich einige finden lassen.
Und wie funktioniert so ein Zufallsgenerator eigendlich?
Kurz gesagt: Er berechnet aus dem Seed weitere Zahlen.
Ansonsten: Siehe Wikiepdia etc.
Es gibt 2 Arten von Zufallszahlen. Einmal eine Pseudozufallszahl, die berechnet wird und es gibt nichtdeterministische Zufallszahlen, die abhängig von natürlichen Ereignissen sind.
Wenn du mal nach Pseudozufallszahl suchst, findest du diverse algorithmen, die du anschließend entsprechend in .NET und einer anderen Programmiersprache (beispielsweise Java) nachbauen kannst.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
in der ct war disletzt auch ein sehr guter artikel http://www.heise.de/kiosk/archiv/ct/2009/2/172
Wir Arbeiten eigendlich nicht wir nehmen nur das geld
Wenn ich unter .NET eine Klasse Random instanziiere und einen Seed angebe erhalte ich immer die gleichen ("Zufalls-")Zahlen.
Mich würde mal interressieren wie es sich mit anderen Programmiersprachen/Bibliotheken verhält.
I.d.R. genauso.
Angenommen ich erstelle einen Generator mit dem Seed 100: Bekomme ich unter .NET die gleichen Zahlen wie unter anderen Bibliotheken?
Mit hoher Wahrscheinlichkeit nicht.
Ist die Funktionsweise des Zufallsgenerators 'genormt'? Und wie funktioniert so ein Zufallsgenerator eigendlich?
Es gibt nur eine Norm für die Güte von Zufallszahlengeneratoren. Ein Zufallsgenerator ist nichts weiter als eine Funktion, die aus dem letzten Wert den nächsten berechnet. Nennt sich mathematisch eine "Reihe".
Bei .NET sieht das so aus:
Konstruktor:
public Random(int Seed)
{
this.SeedArray = new int[0x38];
int num2 = 0x9a4ec86 - Math.Abs(Seed);
this.SeedArray[0x37] = num2;
int num3 = 1;
for (int i = 1; i < 0x37; i++)
{
int index = (0x15 * i) % 0x37;
this.SeedArray[index] = num3;
num3 = num2 - num3;
if (num3 < 0)
{
num3 += 0x7fffffff;
}
num2 = this.SeedArray[index];
}
for (int j = 1; j < 5; j++)
{
for (int k = 1; k < 0x38; k++)
{
this.SeedArray[k] -= this.SeedArray[1 + ((k + 30) % 0x37)];
if (this.SeedArray[k] < 0)
{
this.SeedArray[k] += 0x7fffffff;
}
}
}
this.inext = 0;
this.inextp = 0x15;
Seed = 1;
}
Next:
public int Next()
{
int inext = this.inext;
int inextp = this.inextp;
if (++inext >= 0x38)
{
inext = 1;
}
if (++inextp >= 0x38)
{
inextp = 1;
}
int num = this.SeedArray[inext] - this.SeedArray[inextp];
if (num < 0)
{
num += 0x7fffffff;
}
this.SeedArray[inext] = num;
this.inext = inext;
this.inextp = inextp;
return num;
}
Ich möchte Zufallszahlen generieren die sich bei Bedarf wiederholen sollen.
Dann eben selbst implementieren. Fertigen Code gibts wie Sand am Meer. Musst du halt nur portieren.