Wie für die Generierung von großen Zufallszahlen C
Ich bin auf der Suche nach einem Weg, um die Generierung von großen Zufallszahlen in der Größenordnung von 2^64 in C... (100000000 - 999999999), die in einem public-key-encryption-Algorithmus (p und q).
Will ich nicht erzeugen, eine Zahl kleiner als 2^64 (das heißt, kleiner als 100000000).
Gibt es irgendetwas, das mir helfen könnte, dies zu tun?
- 2^64 ist viel größer als 999999999.
- [100000000 - 999999999] ist 900,000,000 unterschiedliche Werte haben. Diese zahlen sind in der Größenordnung von 30 bit, nicht 64.
Du musst angemeldet sein, um einen Kommentar abzugeben.
random() gibt eine lange, die auf einem 64bit-system sollte 64 bit sein. Wenn Sie auf einem 32bit system können Sie Folgendes tun:
Alternativ auf ein NIX-system, das Sie Lesen konnte /dev/random in Ihren Puffer:
Einen
rand()
ist begrenzt durchRAND_MAX
die nicht notwendig2^32
. Und, Sie noch etwas brauchen, um passieren zusrand()
./dev/random
Funktionalität ist auch verfügbar auf andere Plattformen.num = (num % (999999999 - 100000000)) + 100000000;
zum generieren einer zufälligen Zahl an der unteren Grenze von 100000000 und die Obere Grenze von 999999999.RAND_MAX
ist2^31
, nicht2^32
.u32
gleichmäßig verteilt, ist eine solche kombinierte Anzahlu64 = (u32 << 32) | u32
auch?num = (num << 32) | rand();
ist wahrscheinlich schwach gegeben, "Wenn Sie auf einem 32-bit", dannRAND_MAX
wahrscheinlich ist 2^31-1 oder viel weniger. Dannnum = (num << 32) | rand();
wird immer erzeugen eines raw -num
mit einigen bits gelöscht, die in der gleichen position.num % (999999999 - 100000000)
hilft verteilen das problem etwa noch auf Kosten der noch größere Mangel an einer einheitlichen Verteilung.Könnten Sie kombinieren zwei 4-byte zufällige Ganzzahlen zu erzeugen, eine 8-byte ein:
Seit
rand
zurückint
, undsizeof(int) >= 4
auf fast jeder modernen Plattform, sollte dieser code funktionieren. Ich habe die<< 0
zu machen die Absicht deutlicher.Die Maskierung mit
0x00000000FFFFFFFF
und0xFFFFFFFF00000000
ist, um zu verhindern, dass die überlappung der bits in den beiden zahlen, die im Fallsizeof(int) > 4
.BEARBEITEN
Da @Banthar kommentierte, dass
RAND_MAX
ist nicht unbedingt2 ^ 32
, und ich denke, es ist garantiert mindestens2 ^ 16
Sie kombinieren könnte vier 2-byte-zahlen nur um sicher zu sein:^
zu kombinieren, die zahlen anstelle von|
Sie müssen sich keine Gedanken über die Maskierung.RAND_MAX
ist sehr unwahrscheinlich, dass2 ^ 32
. Es könnte sein(2 ^ 32) - 1
. Doch auch das ist ungewöhnlich. Wahrscheinlicher ist es dasselbe wieINT_MAX
für die sich ein gemeinsamer Wert der(2 ^ 31) - 1
oder(2 ^ 15) - 1
. C gibt anRAND_MAX
mindestens(2^15) - 1
, nicht2 ^ 16
.Du suchst einen kryptografischen Stärke PRNG, wie
openssl/rand
: http://www.openssl.org/docs/crypto/rand.htmlrand()
dafür ist eine Sicherheitslücke (die Vorhersage der Leistung vonrand()
ist nicht sonderlich anspruchsvoll)Ich weiß, ich werde wahrscheinlich erhalten, b____schlug durch OliCharlesworth, aber die Verwendung von rand() mit einer Skalierung und offset. Es ist in stdlib.h, um die ganze Reihe sollte man hinzufügen, dass ein kleiner rand() zum füllen der Lücken in der Zuordnung.
Können Sie eine große Anzahl
L
aus kleineren zahlen (z.B.A
&B
). Zum Beispiel mit so etwas wieL = (2^ n)*A + B
wo ^ bedeutet Potenzierung undn
einige Konstante ganze Zahl (z.B. 32). Dann geben Sie den code1<<n
(Bitweises Links-shift) für die Stromversorgung-der Betrieb 2.So können Sie eine große zufällige Zahl von der kleineren Zufallszahlen.
L, n, A, and b
bedeuten? könnten Sie bitte erklären?u32
gleichmäßig verteilt, ist eine solche kombinierte Anzahlu64 = (u32 << 32) | u32
auch?L = (2^ n)*A + B
ist ein problem, wenn der Bereich derB
ist nicht [0...(2^ n)-1]. BesserL = (2^ n)*A ^ B
wennB
range ist breiter (und noch ein power-of-2). Am besten istL = (max_possible_value_of_B + (type_of_L)1) *A + B
Oder könnten Sie zwei Zufallszahlengeneratoren mit UNABHÄNGIGEN Samen aus und setzen Sie Ihre output zahlen zusammen, wie vorgeschlagen. Das hängt davon ab, ob Sie eine 64 bit-Zahl der a RNG mit einer Periode im Bereich von 2^64. Einfach nicht mit dem Standard-Aufruf, die abhängig von der Zeit, denn Sie erhalten identische Samen für jeden generator. Der richtige Weg ist, ich weiß nur nicht ...