Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Random Seed unter .NET und anderen Bibliotheken
Lector
myCSharp.de - Member



Dabei seit:
Beiträge: 862

Themenstarter:

Random Seed unter .NET und anderen Bibliotheken

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Hallo Lector,
Zitat von 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.
Zitat von Lector
Und wie funktioniert so ein Zufallsgenerator eigendlich?
Kurz gesagt: Er berechnet aus dem Seed weitere Zahlen.
Ansonsten: Siehe Wikiepdia etc.
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
S.H.-Teichhof
myCSharp.de - Member

Avatar #avatar-2460.jpg


Dabei seit:
Beiträge: 1.549
Herkunft: Sindringen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat von Lector
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.
Zitat
Angenommen ich erstelle einen Generator mit dem Seed 100: Bekomme ich unter .NET die gleichen Zahlen wie unter anderen Bibliotheken?

Mit hoher Wahrscheinlichkeit nicht.
Zitat
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;
}
Zitat
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von svenson am .
private Nachricht | Beiträge des Benutzers