Was sind die besser (pseudo) random number generator als der LCG für Lotterie-scheduler?
Ich gern eine Lotterie-scheduler und ich brauche eine sehr gute (pseudo) random number generator ähnlich LCG, aber ich Frage mich, ob es andere bessere Wahl gibt, oder nicht? Ich bin speziell auf der Suche nach random-Generatoren in C geschrieben.
LCG-code:
unsigned long lcg_rand(unsigned long a)
{
return (a * 279470273UL) % 4294967291UL;
}
Ich würde auch gerne wissen, ob srand()
können für diesen Zweck verwendet werden oder ist nicht sehr genau?
- Gibt es einen Grund, warum Sie wählten diese Parameter für Ihr LCG? Der modulus ist ziemlich ungewöhnlich, und es sei denn, Sie entschied sich, es für einen bestimmten Grund, es ist wahrscheinlich, um Ihnen unerwünschte Verzerrungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie brauchen einfache, aber anständige Qualität sind, würde ich die oberen 32 (oder weniger) bits einer 64-bit-LCG, möglicherweise mit einer Temperierung-Funktion an der Ausgabe vorgenommen. Wenn Sie dies tun, ich habe kopiert das Anlassen verwendete Funktion in Mersenne Twister. Ich würde nicht empfehlen, es tatsächlich mit Mersenne Twister, wie es eine Menge mehr Komplexität und internen Zustand als die anderen PRNGs ohne deutlich bessere Qualitäten.
Ist hier einige Beispiel-code:
lcg64_temper(uint64_t *seed)
werden uint64_tlcg64_temper(uint64_t *seed)
und dann warf *Samen:return temper((uint32_t)(*seed) >> 32);
? Oder war das absichtlich codiert zu verwenden, die oberen 32 (oder weniger) bits einer 64-bit-LCG, wie Sie oben beschrieben?Mersenne Twister wäre eine option. Eine weitere option ist Subtrahieren mit carry
meisten Implementierungen der C
rand()
Funktion verwenden Sie Variationen der LGC.rand()
wie jedes computerisierten Zufallsgenerator nicht wirklich zufällig ist, ist es nur pseudo-Zufallszahlen. Mitsrand()
können verbessern Zufälligkeit, aber nicht perfekt. Es hängt davon ab, wie vielfältig und zufällig der Samen verwendetsrand()
ist. Zum Beispiel, wenn Sie angerufenrand()
n-mal mit dem gleichen seed insrand()
würde, wäre das Resultat das gleiche. Aber wenn Sie riefsrand(clock())
jeder Zeit (und die verstrichene Zeit zwischen den anrufen größer war als die Zeit der Zecken inclock()
), dann würden Sie haben eine bessere random-generator.Ist hier ein einfaches code-Beispiel, wo beide
clock()
und eine support-Funktion, NotRecentlyUsed() (für kleine Proben von min und max) verwendet werden:32767.0
Spiele die MS-runtime -RAND_MAX
aber es erzeugt random zahlen in aufsteigender Reihenfolge (nicht sehr random meiner Meinung nach). Darüber hinaus, wenn Sie anrufenrandomGenerator(0, 20)
der code stecken bleibt, in einer Endlosschleife durch, dassNotUsedRecently()
Zeug. Schließlich, SO hat Sie mehrere Fragen und Antworten zeigen, warum ruftsrand()
jedes mal, wenn Sie rufenrand()
ist eine schlechte Idee.rand
als hash-Funktion der aktuellen Zeit? Du wegwerfen jedem Staat, derrand
spart zwischen Anrufe und verwenden Sie eine Uhr, die sich erhöht, bei einer Konstanten rate als die Quelle der Entropie. Das ganze sieht sehr verdächtig, aber Sie tun, was Sie denken, ist richtig.