Mit der Hardware rng von python

Gibt es fertige Bibliotheken, so dass die Intel Hardware prng (rdrand) von numpy Programme verwendet werden kann, um Puffer von zufälligen Zahlen zu füllen?

Failing this kann jemand mich in die richtige Richtung für einige C-Code, die ich anpassen oder verwenden könnte (ich verwende CPython und Cython mit numpy so die nackte Minimum Wrapper shd genug sein).

Die zufälligen Generatoren, die ich will, sind einheitliche Zufallszahlen zwischen [0,1].

2 Solutions collect form web for “Mit der Hardware rng von python”

Dieser Code verwendet / dev / urandom (Unix) oder CryptGenRandom APIs (Windows). Welches RNG verwendet wird, Hardware oder Software, ist abhängig vom Betriebssystem.

Wenn du genau steuern willst, welcher Generator verwendet wird, musst du ihn über seinen Hardwaretreiber oder seine Bibliothek abfragen. Wenn du die zufälligen Bits als String hast, hast du ähnlich wie dieser Code mit np.fromstring proceeed.

Normalerweise können wir dem Betriebssystem vertrauen, um die besten Entropiequellen für seine kryptographischen Dienste, einschließlich des zufälligen Bitgenerators, zu verwenden. Wenn es eine Hardware RNG ist es wahrscheinlich verwendet werden, in der Regel Kombination mit anderen Entropie-Quellen.

import os import numpy as np def cryptorand(n): a = np.fromstring(os.urandom(n*4), dtype=np.uint32) >> 5 b = np.fromstring(os.urandom(n*4), dtype=np.uint32) >> 6 return (a * 67108864.0 + b) / 9007199254740992.0 

Hier ist die Verteilung von 1.000.000 zufälligen Abweichungen, die mit dieser Methode auf Mac OS X erzeugt werden. Wie Sie sehen können, ist es ziemlich einheitlich auf [0,1):

Bildbeschreibung hier eingeben

Wenn Sie wirklich starke kryptografische zufällige Abweichungen benötigen, können Sie / dev / random anstelle von / dev / urandom verwenden. Dies gilt nur für Unix-ähnliche Systeme, nicht für Windows:

 import numpy as np def cryptorand(n): with open('/dev/random','rb') as rnd: a = np.fromstring(rnd.read(n*4), dtype=np.uint32) >> 5 b = np.fromstring(rnd.read(n*4), dtype=np.uint32) >> 6 return (a * 67108864.0 + b) / 9007199254740992.0 

Beachten Sie, dass diese Funktion blockieren könnte, im Gegensatz zu der Version, die os.urandom als Entropiequelle verwendet.

(Edit1: Aktualisierte Normalisierung, um die von NumPy gleichzusetzen)

Bearbeiten 2: Die Kommentare geben den Grund für die Frage war Geschwindigkeit, nicht kryptografische Stärke. Der Zweck der Hardware RNG ist nicht Geschwindigkeit aber Stärke, so macht es die Frage ungültig. Allerdings ist eine schnelle und gute PRNG, die eine Alternative zum Mersenne Twister sein kann, ist George Marsaglias Multiplikator-mit-Carry-Generator. Hier ist eine einfache Implementierung in Cython:

 import numpy as np cimport numpy as cnp cdef cnp.uint32_t gw = 152315241 # any number except 0 or 0x464fffff cdef cnp.uint32_t gz = 273283728 # any number except 0 or 0x9068ffff def rand(cnp.intp_t n): """Generate n random numbers using George Marsaglia's multiply-with-carry method.""" global gw, gz cdef cnp.uint32_t w, z, a, b cdef cnp.intp_t i cdef cnp.ndarray x = cnp.PyArray_SimpleNew(1, &n, cnp.NPY_FLOAT64) cdef cnp.float64_t *r = <cnp.float64_t*> cnp.PyArray_DATA(x) w,z = gw,gz for i in range(n): z = 36969 * (z & 65535) + (z >> 16) w = 18000 * (w & 65535) + (w >> 16) a = (z << 16) + w z = 36969 * (z & 65535) + (z >> 16) w = 18000 * (w & 65535) + (w >> 16) b = (z << 16) + w r[i] = (a * 67108864.0 + b) / 9007199254740992.0 gw,gz = w,z return x 

Achten Sie darauf, dass weder Mersenne Twister noch Multiplikations-mit-tragen haben kryptographische Stärke.

Ja. Es gibt ein Rdrand-Modul.

Python ist die beste Programmiersprache der Welt.