Laden...

Random Seed unter .NET und anderen Bibliotheken

Erstellt von Lector vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.329 Views
L
Lector Themenstarter:in
862 Beiträge seit 2006
vor 14 Jahren
Random Seed unter .NET und anderen Bibliotheken

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?

5.742 Beiträge seit 2007
vor 14 Jahren

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.

3.971 Beiträge seit 2006
vor 14 Jahren

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...

1.549 Beiträge seit 2004
vor 14 Jahren

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

S
8.746 Beiträge seit 2005
vor 14 Jahren

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.