Forum: PC-Programmierung Platform unabhängige Zufallszahlen


von J. B. Johnson (Gast)


Lesenswert?

Moin allerseits,

ich brauche für eine Anwendung einen Pseudozufallszahlengenerator, der 
auf allen Zielplattformen (bei gleichem Seed) die gleiche Sequenz an 
Zahlen ausgibt.

Ich habe bei wikipedia den folgenden Code gefunden(leicht modifiziert):
1
uint32_t m_w = <choose-initializer>;    /* must not be zero, nor 0x464fffff */
2
uint32_t m_z = <choose-initializer>;    /* must not be zero, nor 0x9068ffff */
3
4
uint32_t get_random()
5
{
6
    m_z = 36969 * (m_z & 65535) + (m_z >> 16);
7
    m_w = 18000 * (m_w & 65535) + (m_w >> 16);
8
    return (m_z << 16) + m_w;  /* 32-bit result */
9
}

Mit fällt auf den ersten Blick keine Plattformabhängigkeit auf. Aber da 
ich nicht alle Kombinationen testen kann, die Frage in die Runde: 
Liefert diese Funktion wirklich überall die gleichen Zahlen?
Die Systeme, auf denen es funktionieren soll sind:
- Windows, Linux, MacOS
- 32 Bit / 64 Bit
- Little Endian / Big Endian

von Sebastian V. (sebi_s)


Lesenswert?

J. B. Johnson schrieb:
> - Windows, Linux, MacOS
Du nutzt keine OS Funktionen, also kein Problem.

J. B. Johnson schrieb:
> - Little Endian / Big Endian
Du arbeitest ja nur mit den Variablen und versuchst nicht Byteweise von 
derren Speicheraddresse zu lesen. Sowas wie m_w >> 16 funktioniert 
immer, unabhängig von der Endianness des Systems.

J. B. Johnson schrieb:
> - 32 Bit / 64 Bit
Das ist der einzige Punkt der etwas fraglich ist. Immerhin benutzt du 
schon den uint32_t Typ der damit schonmal eine feste Größe hat. Deine 
Konstanten sind aber je nach System von unterschiedlicher Größe, aber 
sind höchstens kleiner als 32 Bit und bei den Operationen wird es 
konvertiert was eigentlich keine Probleme verursachen sollte.

Wenn int beispielsweise nur 16 Bit ist dann ist 18000 ein int, aber 
36969 ist zu groß und damit wohl ein long. Bei den Operationen sollte 
aber dann alles zu unsigned long konvertiert werden.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.