Echte Zufallszahlen keine pseudo ( CryptGenRandom )



  • #include <Windows.h>
    
    int getRandomNumber() {
    	HCRYPTPROV   hCryptProv = 0;
    	BYTE         pbData[32];
    
    	CryptAcquireContextW(&hCryptProv, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT);
    	CryptGenRandom(hCryptProv, 32, pbData);
    	CryptReleaseContext(hCryptProv,NULL);
    
    	return (int)pbData;
    }
    

    Hallo,
    wenn ich meine Funktion 5 mal hintereinander aufrufe kommen 5 mal die gleichen Werte raus. Irgendwie scheint mir das diese Funktion Pseudozufallszahlen erzeugt, könnt ihr mir helfen wie ich unter Windows richtige Zufallszahlen erzeugen kann ?



  • "Echter" Zufall geht doch nur per Hardware (Rauschen)?!
    Und selbst das ist nicht wirklich echt, denn das gibt's nicht 😃 Jede Information hängt von etwas ab... 😉



  • Du gibt die Adresse von pbData nach int gecastet zurück. Aktiviere oder lies mal die Warnungen deines Compilers:

    warning C4172: returning address of local variable or temporary

    int getRandomNumber() {
        HCRYPTPROV   hCryptProv = 0;
        int pbData = 0;
    
        CryptAcquireContextW(&hCryptProv, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT);
        CryptGenRandom(hCryptProv, sizeof(pbData), reinterpret_cast<BYTE*>(&pbData));
        CryptReleaseContext(hCryptProv,NULL);
    
        return pbData;
    }
    


  • Wenn du es schaffst, echte Zufallszahlen zu erzeugen, dann winkt dir sicherlich der ein oder andere Wissenschaftspreis. Allerdings wird das aufgrund von deterministischer Kausalität im Kontext dieses Universums wohl nie möglich sein. 🤡





  • knivil schrieb:

    @Hi & determined: http://www.youtube.com/watch?v=5KT2BJzAwbU 🙂

    😃 👍

    @Raven147852

    Nimm ein guter PRNG wie https://www.schneier.com/yarrow.html und für den seed ein paar gute Entropie Quellen deines Systems.



  • knivil schrieb:

    @Hi & determined: http://www.youtube.com/watch?v=5KT2BJzAwbU 🙂

    Blabla, dann erklär mal. Was ist das Problem an meinen Aussagen?



  • Mal rueckwaerts: Rauschen ist keine Information. Es gibt echten Zufall. Ja, man braucht Hardware.



  • Ich kriege das leider auf ideone und co nicht zum laufen (die linken pthreads nicht rein), ist auch alles UB, aber vielleicht läuft es bei euch. Bei mir spuckt er zufällig aussehende Zahlen aus.

    Wenn sich jemand mit Zufallszahlentests auskennt wäre ich daran interessiert wie gut die Zahlen sind. Ist eigentlich kein ernst gemeinter Vorschlag für einen Zufallszahlengenerator, aber ich finde es hat Potential.

    //torn values
    
    #include <memory>
    #include <iostream>
    #include <future>
    
    char buffer[8192];
    
    void *align(std::size_t alignment, std::size_t size, void *&ptr, std::size_t &space){ //because gcc is missing std::align
    	auto pn = reinterpret_cast<std::size_t>(ptr);
    	auto aligned = (pn + alignment - 1) & -alignment;
    	auto new_space = space - (aligned - pn);
    	if (new_space < size)
    		return nullptr;
    	space = new_space;
    	return ptr = reinterpret_cast<void *>(aligned);
    }
    
    int main(){
    	typedef long long int testtype;
    	static_assert(sizeof (long long int) == 8, "");
    	std::size_t space = sizeof buffer - 1;
    	void *ap = &buffer[sizeof(testtype)];
    	if (!align(4096, sizeof(testtype), ap, space)){
    		std::cout << "Failed aligning\n";
    		return 0;
    	}
    	testtype &n = *(testtype *)&((char *)ap)[-4];
    	//std::cout << ap << ' ' << &n << '\n';
    	int weirdvalues = 0;
    	int values = 0;
    	while (weirdvalues < 100){
    		n = 0;
    		auto t1 = std::async(std::launch::async, [&]{for (int i = 0; i < 100000; i++) n++; });
    		auto t2 = std::async(std::launch::async, [&]{for (int i = 0; i < 100000; i++) n--; });
    		t1.wait();
    		t2.wait();
    		if (n > 100000 || n < -100000){
    			std::cout << n % 10000 << '\n';
    			weirdvalues++;
    		}
    		values++;
    	}
    	//std::cout << weirdvalues << '/' << values << '\n';
    }
    


  • knivil schrieb:

    Rauschen ist keine Information.

    Na sicher ist Rauschen auch Information.

    knivil schrieb:

    Es gibt echten Zufall.

    Das bleibt wohl ewig Ansichts/Definitionssache (was ist "echt", ab welcher Indirektionskomplexität ist es "Zufall").

    🙂 🙂 🙂



  • Das bleibt wohl ewig Ansichts/Definitionssache (was ist "echt", ab welcher Indirektionskomplexität ist es "Zufall").

    Mal von der philosphischen Seite abgesehen:
    Zufallszahlen die durch einen Algorithmus aus einem Startwert berechnet werden sind kein echter Zufall weil sie reproduzierbar sind. Daten durch Rauschen (durch Hardware wahrgenommen) können nicht reproduziert werden und sind daher echte Zufallszahlen.

    Theoretisch könnte man am PC auch echte Zufallszahlen bekommen, sei es durch spezielle Hardware, Zufallszahlengeneratoren im Internet oder was weiß ich was. Theoretisch sollte es reichen z.B. das Rauschen der Soundkarte zu nutzen.

    Die Frage ist nur warum es "echte" Zufallszahlen sein müssen ? Pseudozufallszahlen reichen in 99% der Fälle vollkommen aus.



  • Hi schrieb:

    knivil schrieb:

    Rauschen ist keine Information.

    Na sicher ist Rauschen auch Information.

    Begruendung?



  • @ Hi: Was bedeutet es für dich, dass eine Nachricht keine Information enthält? Welche Information hast du, wenn du eine Nachricht (Bitfolge) erhälst, die gleichwahrscheinlich und statistisch unabhängig 0en und 1en enthält (also ungefähr gleich viele 0en und 1en)? In dem Fall ist die (Shannon-)Entropie maximal, was ein guter Kandidat für eine Definition von "keine Information" ist.



  • Echte Zufallszahlen gibt es auf einem System.
    Zum Beispiel bei Linux reicht es aus die virtuelle Gerätedatei /dev/urandom auszulesen.
    Als Zufall wird dort zb der Zeitintervall zwischen 2 Interrupts von zufälliger Hardware gemessen oder Zeitintervall zwischen 2 oder mehr Tastaturschläge des Users oder anhand der Mausbewegung des Users. Linux kommt ganz ohne spezielle Hardware aus dafür.

    Zufall gibt es. Zum Beispiel der zerfallsprozess einer radioaktiven Quelle oder das Hintergrundrauschen des Universums.

    Wieso ist Rauschen eine Information ?
    Weil du das Rauschen wahrnehmen kannst ist es eine Information



  • Raven147852 schrieb:

    Weil du das Rauschen wahrnehmen kannst ist es eine Information

    Aha. Diese Definition lässt sich aber schlecht formalisieren.



  • Weil du das Rauschen wahrnehmen kannst ist es eine Information

    Nein, das ist die Definition eines Signals .. ich kann es messen. Information muss es trotzdem nicht enthalten.



  • Jodocus schrieb:

    In dem Fall ist die (Shannon-)Entropie maximal, was ein guter Kandidat für eine Definition von "keine Information" ist.

    Wenn die Entropie maximal ist, und die Entropie ein Maß für den Informationsgehalt ist, dann ist letzterer auch maximal, oder? Mehr praktisch formuliert: Daten aus einer gleichverteilt rauschenden Quelle lassen sich nicht komprimieren.



  • Ich kenne als Definition von Information die Beseitigung von Unklarheit.
    "Funktioniert der Fernseher?" -> Fernseher anschalten -> Nur Rauschen -> "Nein, tut er nicht". Dass der Fernseher rauscht hat Unklarheit beseitigt, also war da 1 Bit Information drin. Andererseits würde ich Rauschen als Signal ohne Information definieren.
    Damit hängt es vom Betrachter ab, ob ein Signal Information enthält, je nachdem, ob er daraus schlau wird. Ein Text auf chinesisch enthält für mich keine Information, für einen Chinesen schon. Linux liest auch einfach ein paar Daten aus dem Hauptspeicher irgendwelcher Programme um Zufallszahlen zu generieren. Für das Programm ist es überhaupt nicht zufällig was da steht, für den Rest der Welt schon.



  • Bashar schrieb:

    Wenn die Entropie maximal ist, und die Entropie ein Maß für den Informationsgehalt ist, dann ist letzterer auch maximal, oder?

    Ja, aber was heißt das? Der Informationsgehalt eines Zeichens drückt sich darin aus, wie viele Bits man zu dessen Darstellung mindestens benötigt. Wenn der Erwartungswert des Informationsgehaltes (= die Entropie) nun den maximalen Wert (in Abh. der Auftrittswahrscheinlichkeit) annimmt, spricht das nicht gerade für die Extremalanforderung an den Informationsgehalt, so klein zu sein wie nur möglich. Mir scheint das Wort "Informationsgehalt" etwas schlecht gewählt, denn ein Zeichen, was nur wenige Bits zur Darstellung benötigt (also einen geringen Informationsgehalt hat), trägt eine große Information. K.A., ob das englische "self-information" besser langt.



  • Jodocus schrieb:

    Bashar schrieb:

    Wenn die Entropie maximal ist, und die Entropie ein Maß für den Informationsgehalt ist, dann ist letzterer auch maximal, oder?

    Ja, aber was heißt das? Der Informationsgehalt eines Zeichens drückt sich darin aus, wie viele Bits man zu dessen Darstellung mindestens benötigt. Wenn der Erwartungswert des Informationsgehaltes (= die Entropie) nun den maximalen Wert (in Abh. der Auftrittswahrscheinlichkeit) annimmt, spricht das nicht gerade für die Extremalanforderung an den Informationsgehalt, so klein zu sein wie nur möglich.

    Woher kommt diese Anforderung?

    Mir scheint das Wort "Informationsgehalt" etwas schlecht gewählt, denn ein Zeichen, was nur wenige Bits zur Darstellung benötigt (also einen geringen Informationsgehalt hat), trägt eine große Information. K.A., ob das englische "self-information" besser langt.

    OK, dann so. Angenommen, wir haben eine Quelle, die gleichverteilt Zahlen von 0 bis 255 ausspuckt, also Zeichen. Wie hoch ist die self-information von 'A'? Wie hoch die von '\0'? Ich würde mal vermuten, dass sie jeweils 1/256 sind, auch wenn 00000000 nicht nach Rauschen "aussieht". Jedenfalls scheint mir diese Überlegung nicht geeignet, irgendwas darüber auszusagen, ob Rauschen Information ist oder nicht.


Anmelden zum Antworten