Iff Sie eine ausreichend gute Quelle von zufälligen Bytes haben (wie, sagen wir,/dev/random oder/dev/urandom auf einem Linux-Rechner), können Sie einfach verbrauchen 8 Bytes aus dieser Quelle und verketten sie. Wenn sie unabhängig sind und eine lineare Verteilung haben, sind Sie eingestellt.
Wenn Sie dies nicht tun, können Sie durch dasselbe, aber es ist wahrscheinlich, dass einige Artefakte in Ihrem Pseudo-Zufallsgenerator, der einen Halt für alle Arten von Hallo-Jinx gibt.
Beispielcode vorausgesetzt, wir haben eine offene binäre FILE *source
:
/* Implementation #1, slightly more elegant than looping yourself */
uint64_t 64bitrandom()
{
uint64_t rv;
size_t count;
do {
count = fread(&rv, sizeof(rv), 1, source);
} while (count != 1);
return rv;
}
/* Implementation #2 */
uint64_t 64bitrandom()
{
uint64_t rv = 0;
int c;
for (i=0; i < sizeof(rv); i++) {
do {
c = fgetc(source)
} while (c < 0);
rv = (rv << 8) | (c & 0xff);
}
return rv;
}
Wenn Sie mit „get Bytes aus einem Funktionsaufruf“ „zufällige Bytes aus einer Zufälligkeit Gerät lesen“ ersetzen, alles, was Sie tun müssen, ist zu Passe die Verschiebungen in Methode 2 an.
Es ist viel wahrscheinlicher, dass Sie eine "Nummer mit vielen Ziffern" erhalten als eine mit "kleiner Ziffernanzahl" (von allen Zahlen zwischen 0 und 2 ** 64, ungefähr 95% haben 19 oder mehr Dezimalziffern) , so ist das wirklich, was Sie meistens bekommen
** Nicht ** concatenate 'rand()', wie Sie alle Arten von Autokorrelationseffekte haben werden, und die Verteilung wird nicht sei einheitlich. Werfen Sie einen Blick auf diese: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/C-LANG/c-lang.html – Bathsheba
'Ich möchte auch Ergebnisse wie 5 , 11, 33387' => es gibt 10 mal mehr Zahlen zwischen 1000000000000000000 und 9999999999999999999 als zwischen 0 und 1000000000000000000 ... also erwarten Sie nicht, Zahlen wie 5 bald zu sehen –
Sie scheinen verwirrt über die Basis 10 Ziffern (0. ..9) und Bits (Basis-2 Ziffern). Halte diese in deinem Denken getrennt, um es besser zu verstehen. – hyde