PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : JAVA Code Frage


Osmoses
2014-07-05, 14:16:00
Hallo!

Habe ein Programm in JAVA geschrieben um Zufallszahlen zu erzeugen.
Besser gesagt ein Programm erstellt, welches ein zufälliges Ergebnis (seed) liefert, auf welchem Pseudozufallszahlen berechnet werden können.

Habe das Programm so gestaltet, dass es sich automatisch an die verfügbare Rechenkapazität anpasst ohne das Ergebnis zu beeinträchtigen.

Tests habe ich auf verschiedenen Maschinen von P233 MMX bis i7-3930K durchgeführt.

Mich würde aber die Meinung anderer interessieren um die eigene Betriebsblindheit zu umgehen.

Wie kann ich den Code hier veröffentlichen ohne meine Rechte zu verwirken?
Ich will jetzt kein Geld damit verdienen, aber würde schon gern als Urheber genannt werden.

Ich dachte daher den Code als quelloffene Freeware hier einmal zur Validierung und Einsicht zu posten.

Was meint ihr?

Nagelbrett
2014-07-05, 14:23:50
Moment... du sagst, du hast quasi das Rad neu erfunden und sorgst dich nun ernsthaft um deine Rechte daran? :)

Schreib halt dazu, was mit dem Code alles (nicht) passieren darf.

Marscel
2014-07-05, 14:26:29
Aha.

Du bist der Urheber, und wenn du das nicht für deinen Arbeitgeber oder so gemacht hast, kannst du deine Terms diktieren. Guck dir die üblichen OS-Codelizenzen (http://opensource.org/licenses) an und such dir was aus.

PatkIllA
2014-07-05, 14:53:55
Tests habe ich auf verschiedenen Maschinen von P233 MMX bis i7-3930K durchgeführt. Alleine das klingt schon sehr seltsam.
Das Programm muss ja auch irgendeinen Input haben.

Nur durch das Veröffentlichen verwirkt man auch keine Rechte. Ohne Lizenz kann man das legal nicht nutzen.

Osmoses
2014-07-05, 14:56:06
Alleine das klingt schon sehr seltsam.
Das Programm muss ja auch irgendeinen Input haben.

Ich bin mir ja selbst unsicher, daher will ich ja die Meinung des FOrums wissen und will ja den Code herzeigen.

Quelloffene Freeware sollte also eine gute Option fürs Erste sein, oder?
Dann mach ich mich ans Kommentieren des Code...

Osmoses
2014-07-05, 18:07:08
Code - entfernt.

PatkIllA
2014-07-05, 18:17:12
Das einzige was da als Zufall reingeht ist die Uhrzeit.
Die ist je nach Implementierung der JVM und dem System meist nur eingeschränkt genau (AFAIK 16 ms unter Windows). Zusammen mit der eingeschränkter Laufzeit ist das eine sehr eingeschränkte Menge an Möglichkeiten.
Ob da wirklich eine Zufällige verteilung rauskommt sei auch mal dahingestellt.

Wenn man halbwegs brauchbare Zufallszahlen will, dann braucht man deutlich mehr an Entropie. Am besten nimmt man da gleich den Zufallsgenerator des Betriebssystems oder eine entsprechende Kapselung (SecureRandom im Fall von Java)

Osmoses
2014-07-05, 18:32:41
Das einzige was da als Zufall reingeht ist die Uhrzeit.
Die ist je nach Implementierung der JVM und dem System meist nur eingeschränkt genau (AFAIK 16 ms unter Windows). Zusammen mit der eingeschränkter Laufzeit ist das eine sehr eingeschränkte Menge an Möglichkeiten.
Ob da wirklich eine Zufällige verteilung rauskommt sei auch mal dahingestellt.

Wenn man halbwegs brauchbare Zufallszahlen will, dann braucht man deutlich mehr an Entropie. Am besten nimmt man da gleich den Zufallsgenerator des Betriebssystems oder eine entsprechende Kapselung (SecureRandom im Fall von Java)

Nicht die Uhrzeit, sondern die Zeit welche die Berechnung braucht.
Die kann nie immer auf die Milisekunde gleich sein und daher mMn eine gute Basis als seed.

PatkIllA
2014-07-05, 18:37:32
Nicht die Uhrzeit, sondern die Zeit welche die Berechnung braucht.
Die kann nie immer auf die Milisekunde gleich sein und daher mMn eine gute Basis als seed.
Mittlerweile werden die Algorithmenrechenzeiten aus dem Stromverbrauch und Spulenfiepen angenähert.
Und selbst wenn die Rechenzeit um ein paar ms schwankt werden die Möglichkeit lediglich um einen relativ kleinen Faktor größer.

Shink
2014-07-05, 18:52:46
Was meint das Forum?
Dass Teile deines Codes möglicherweise irgendwann mal vom Compiler wegoptimiert werden?:D

Bei einem Zufallszahlgenerator sind imo die Hauptfragen:
- Will man damit möglichst zufällige oder kryptografisch sichere (nicht vorhersagbare) Zufallszahlen sein?
- Warum zum Geier will man das selbst machen? Sportlicher Ehrgeiz? Sparta? Weil man's kann?

Marscel
2014-07-05, 18:56:16
Nicht die Uhrzeit, sondern die Zeit welche die Berechnung braucht.
Die kann nie immer auf die Milisekunde gleich sein und daher mMn eine gute Basis als seed.

Doch! Wir sprechen hier von Millisekunden. Nicht Micro, Nano, Pico...

Andersrum, was war deine Motivation hierfür? Wo sahst du ein Problem? In welche Lücke gedachtest du hiermit vorzudringen?

Osmoses
2014-07-05, 19:09:27
Werde wohl noch weiter in Tutorials schmöckern.

Danke für die Kritik.

Gast
2014-07-06, 00:14:03
Hallo, wenn es dir gelingt echte Zufallszahlen auf einem Computer zu erzeugen gewinnst du wahrscheinlich den Nobelpreis.
Viel Glück dabei.

Monger
2014-07-06, 09:59:45
Nicht die Uhrzeit, sondern die Zeit welche die Berechnung braucht.
Die kann nie immer auf die Milisekunde gleich sein und daher mMn eine gute Basis als seed.
Eine Zufallszahl soll ja für n -> n + 1 eine möglichst unähnliche Zahl ergeben. Wenn du den Seed aber an der Jetzt-Zeit misst, ist der Seed sich aber immer selbst ähnlich (so wie Jetzt -> Jetzt + 1 eben auch ähnlich ist), und damit potentiell auch die daraus berechnete Zufallszahl.
Es gibt zwar gute Hash Algorithmen die diese Ähnlichkeit zumindest ordentlich verschleiern, aber für Kryptographieanwendungen wäre das nicht ausreichend.

Osmoses
2014-07-06, 11:24:13
Eine Zufallszahl soll ja für n -> n + 1 eine möglichst unähnliche Zahl ergeben. Wenn du den Seed aber an der Jetzt-Zeit misst, ist der Seed sich aber immer selbst ähnlich (so wie Jetzt -> Jetzt + 1 eben auch ähnlich ist), und damit potentiell auch die daraus berechnete Zufallszahl.
Es gibt zwar gute Hash Algorithmen die diese Ähnlichkeit zumindest ordentlich verschleiern, aber für Kryptographieanwendungen wäre das nicht ausreichend.

Damit komm ich weiter. Danke.
Ergo ist das Problem nicht das Ergebnis an sich, sondern die Nähe zu den weiteren Ergebnisen (Ähnlichkeit).

Es muss also am Besten eine Variable (8, 32 oder 64Bit) mit jedesmal unähnlichen Werten befüllen.

Richtig verstanden?

PatkIllA
2014-07-06, 11:58:33
Mir ist immer noch nicht das Ziel klar.
Wenn du was lernen willst, dann solltest du dich mit der Mathematik dahinter beschäftigen.

Wenn du es konkret einsetzen willst, dann ist praktisch immer eine ganz ganz schlechte Idee da was selbst zu machen.
Selbst wenn anerkannte Algorithmen oder Bibliotheken eingesetzt werden, passieren da noch sehr oft Fehler.

Osmoses
2014-07-06, 12:37:19
Mir ist immer noch nicht das Ziel klar.
Wenn du was lernen willst, dann solltest du dich mit der Mathematik dahinter beschäftigen.

Wenn du es konkret einsetzen willst, dann ist praktisch immer eine ganz ganz schlechte Idee da was selbst zu machen.
Selbst wenn anerkannte Algorithmen oder Bibliotheken eingesetzt werden, passieren da noch sehr oft Fehler.

Die Mathe aus dem Physikstudium muss reichen - muss mich wieder in Form bringen.

Zu dem Zweck:
Ich habe da eine Idee und ein wichtiger Meilenstein ist die Produktion von Zufallszahlen - plattformunabhängig und performant auch auf alter Hardware.

PatkIllA
2014-07-06, 12:51:04
Selbst das Auslesen der Zeit ist platformabhängig.

Deine Idee zu testen wird auch mit den eingebauten Zufallsgeneratoren des Betriebsssystems gehen.

Braucht man nicht gerade zum Testen was Reproduzierbares? Ich teste öfters mal Laufzeiten mit Zufallszahlen, wo ich eine (scheinbar) zufällige aber reproduzierbare Eingabe haben möchte.

Wenn du es richtig machen willst dann kaufe einen Hardwarezufallsgenerator.

EPIC_FAIL
2014-07-06, 13:02:16
Damit komm ich weiter. Danke.
Ergo ist das Problem nicht das Ergebnis an sich, sondern die Nähe zu den weiteren Ergebnisen (Ähnlichkeit).

Es muss also am Besten eine Variable (8, 32 oder 64Bit) mit jedesmal unähnlichen Werten befüllen.

Richtig verstanden?

unähnlich ist nicht unbedingt gefordert. Wichtig ist:
(bei Beschränkung auf Bits)
1)Gleichverteilung von 0 und 1
2)statistische Unabhängigkeit. Also, dass bei Betrachtung der Zahlen mit dem Index 0 bis n nicht auf das n+1te geschlossen werden kann.

Aus der Berechnungszeit irgendeinen Seed zu generieren halte ich für etwas gefährlich, da theoretisch wiederholbar mit relativ kleinem Delta. Mit Seitenkanalangriffen verschiedenster Art könnte ein Angreifer das Ergebnis der Berechnung schon eingrenzen.

HajottV
2014-07-06, 17:04:43
Es muss also am Besten eine Variable (8, 32 oder 64Bit) mit jedesmal unähnlichen Werten befüllen.

Ohne jetzt den Code gesehen zu haben:

1) 64 Bit sind zu wenig

2) Aus einem Zeitstempel ohne weitere Handstände eine gute Zufallszahl zu generieren, wird nicht gelingen.

Noch was: hast Du etwa System.currentTimeMillis() benutzt? Die Auflösung auf Windowssystemen liegt da bei 16ms. D.h. angenommen ich weiß, dass der Forenbenutzer Xyz sein Passwort mit "Deiner" Zufallszahl unter Windows7 erzeugt hat... dann gehe ich in sein öffentliches Profil, stelle fest, dass es am 2013-04-21 erstellt wurde und habe dann 22.3 Bit = ln_2(24 * 3600 * 1000 / 16), die ich per brute force durchrechnen muss. Das wird selbst Dein Handy im Bruchteil einer Sekunde schaffen.

Ich hab im Studium als HiWi die Kryptografie-Vorlesung betreut und dadurch weiß ich, dass ich nichts, gar nichts, kein bisschen über Kryptografie weiß! Da muss man ganz ganz demütig sein... sofern Du da nicht eine allgemein annerkannte Koryphäe bist, geh davon aus, dass alles, ws Du machst, von einem Profi in ein paar Stunden Arbeit geknackt wird.

Guckst Du hier:

http://de.wikipedia.org/wiki/Kryptographisch_sicherer_Zufallszahlengenerator

Osmoses
2014-07-06, 18:58:21
Keine Zeitstempel.

Das Prinzip ist so:

Möglichkeit der möglichen Berechnungen/Zeit checken und die Anzahl der Berechnungen speichern.

1. Zeit nehmen.
Starte Kurvendiskussion z.B. y=x^2+x-8, für x = (-1)*AnzahlBerechnungen bis Anzahlberechnungen.
2. Zeit nehmen.

2. - 1. Zeit => seed

Das war der Gedanke dahinter.

Diese Zeit kann (und war in meinen Tests) nie exakt gleich.

Zur Sicherheit noch x weitere Durchgänge mit anderen Berechnungen und die Differenzen summieren.

PatkIllA
2014-07-06, 19:13:54
Möglichkeit der möglichen Berechnungen/Zeit checken und die Anzahl der Berechnungen speichern.

1. Zeit nehmen.
Starte Kurvendiskussion z.B. y=x^2+x-8, für x = (-1)*AnzahlBerechnungen bis Anzahlberechnungen.
2. Zeit nehmen.

2. - 1. Zeit => seed

Das war der Gedanke dahinter. Was führt dich denn zu der Annahme, dass das auch nur ansatzweise eine gute Zufallsfall ergibt?
Diese Zeit kann (und war in meinen Tests) nie exakt gleich. Es reicht ja wenn der Bereich eingeschränkt ist. Und der ist hier sehr sehr sehr deutlich eingeschränkt.
Ich hab im Studium als HiWi die Kryptografie-Vorlesung betreut und dadurch weiß ich, dass ich nichts, gar nichts, kein bisschen über Kryptografie weiß! Da muss man ganz ganz demütig sein... sofern Du da nicht eine allgemein annerkannte Koryphäe bist, geh davon aus, dass alles, ws Du machst, von einem Profi in ein paar Stunden Arbeit geknackt wird.Ich habe ein Informatikstudium und würde mich da auch nicht rantrauen.
Es hat schon seinen Grund, warum Algorithmen bestenfalls nach Jahren und hunderten Überprüfungen wirklich zu einem Standard werden.

EPIC_FAIL
2014-07-06, 19:29:46
Keine Zeitstempel.

Das Prinzip ist so:

Möglichkeit der möglichen Berechnungen/Zeit checken und die Anzahl der Berechnungen speichern.

1. Zeit nehmen.
Starte Kurvendiskussion z.B. y=x^2+x-8, für x = (-1)*AnzahlBerechnungen bis Anzahlberechnungen.
2. Zeit nehmen.

2. - 1. Zeit => seed

Das war der Gedanke dahinter.

Diese Zeit kann (und war in meinen Tests) nie exakt gleich.

Zur Sicherheit noch x weitere Durchgänge mit anderen Berechnungen und die Differenzen summieren.

Beweis mal bitte (mathematisch!), dass die Zeit nie gleich sein kann. Ein Test ist relativ nichtsaussagend. Was passiert beispielsweise, wenn du zufällig exakt die gleiche Laufzeit beim Algorithmus hast? Wie sieht es mit der Gleichverteilung des generierten Seeds aus?

Wie die anderen schon sagten, ist Krypto extrem komplex und man kann unglaublich viele Fehler machen.

Monger
2014-07-06, 20:47:45
Diese Zeit kann (und war in meinen Tests) nie exakt gleich.

Sie ist aber auch nicht maximal unterschiedlich. Für eine echte Zufallsverteilung müsste diese Funktion für jeden Wert von 32Bit bzw. 64Bit gleich häufig vorkommen. Da deine Funktionen aber eben tendentiell eher kurz als lang laufen, hast du da schon mal eine klare Tendenz zu einem eingeschränkten Wertebereich.

Ist schon richtig: man sollte solche Fragen den Mathematikern überlassen. Kein Normalsterblicher versteht all die versteckten Annahmen die man selbst bei so trivialen Algorithmen macht.

Coda
2014-07-06, 22:37:53
Was willst du überhaupt bezwecken? Es gibt für krypto und für nicht-kryptografische Anwendungen absolut brauchbare und schnelle Zufallsgeneratoren. Für nicht krypto haben Mersenne Twister eine bewiesene Periode von 2^19937 und für krypto benutzt man eine sichere Block-Cipher im Counter-Modus (AES oder was anderes).

Gerade falls du da wirklich Krypto machen wolltest kann ich dir gleich sagen, dass dein Algorithmus mit großer Sicherheit den internen State verrät wenn man die generierte Reihe analyisiert. Das ist ein Ausschlusskriterium.

Gast
2014-07-06, 23:55:16
Was evtl einen besseren Zufallsseed geben könnte:

Du merkst dir die Zeit, die Currenttimemillis zurück gibt. Dann rechnest du in einer Schleife immer wieder eine kleine Berechnung, rufst dann wieder currenttimemillis aus und wenn da das gleiche wie vorher zurückkommt machst das gleiche nochmal und zählst wie oft du das machen kannst, bis currenttimemillis was anderes zurückgibt.

Von der Anzahl der Durchläuft nimmst du dann nur einige der least significant bits, also rechnest die Anzahl mod 256 oder so, dann hast du 8 bit Entropie. Das machst du dann noch 32 mal oder so, dann hast du schonmal insgesamt 256 bit als seed für deinen zufallsgenerator. Jenachdem, wie stark die Anzahl der durchläuft schwankt, musst du evtl noch weniger Bits pro Runde nehmen...

Sry falls mein Geschreibsel jetzt ziemlich wirr klingt, aber ich sollte eigentlich schon längst am pennen sein und nicht versuchen, Texte über Krypto und Zufallszahlen zu schreiben ;)

Marscel
2014-07-07, 00:19:42
Nein, lasst einfach die Finger vom Ausdenken von Kryptographieverfahren, das sind Aufgaben für Kryptomathematiker.

Asaraki
2014-07-07, 14:29:55
Wieso macht man sich über solche Dinge Gedanken, bevor man nicht zumindest die üblichsten Verfahren verstanden hat und auch die Obsoleten (wo man dann meist seine eigene "neue" Idee wieder findet :D)

Folgender Leitsatz :
Meistens wenn man meint Ideen zu haben, die bahnbrechend sind, gilt folgendes : Ist Quark.

Shink
2014-07-07, 15:20:36
Folgender Leitsatz :
Meistens wenn man meint Ideen zu haben, die bahnbrechend sind, gilt folgendes : Ist Quark.
Nö. Imo eher: "Hat vorher schon jemand gedacht".
Was hab ich mich gefreut, als ich mal das Sieb des Eratosthenes "erfunden" hab.:freak:

Osmoses
2014-07-08, 01:51:42
So, habe heute nicht so viel Zeit nebenher gehabt, aber jetzt bin ich dazugekommen;

Habe die Zeitdauer als Basis für einen Münzwurf genommen (true/false) und 10 mal werfen lassen.

Ergebnis:

true : false -- 8 : 1

true : false -- 6 : 3

true : false -- 3 : 6

true : false -- 4 : 6

Nun die Anzahl der Würfe auf 1000 gesetzt:

true : false -- 487 : 513

true : false -- 514 : 486

Werde dies jetzt wiederum 1000x machen lassen (dürfte wohl etwas dauern ...) und die true/false (0 und 1) Abfolgen speichern um da noch mal hinzusehen.

HajottV
2014-07-08, 09:42:18
Vorschlag: Du legst mal auf Dropbox eine gezippte Liste mit 10 Millionen fortlaufenden Zufallszahlen nach Deinem Algorithmus, und dann lass mal sehen, ob man da nicht Struktur drin findet.
Wenn ja, ist der Algo durchgefallen.
Wenn nein, dann bedeutet das zumindest, dass die Zahlen auf den ersten Blick etwas taugen könnten, ist aber kein Beweis, dass sie wirklich gut sein ("Absence of evidence isn't evidence of absence.")

Osmoses
2014-07-08, 12:33:35
Vorschlag: Du legst mal auf Dropbox eine gezippte Liste mit 10 Millionen fortlaufenden Zufallszahlen nach Deinem Algorithmus, und dann lass mal sehen, ob man da nicht Struktur drin findet.
Wenn ja, ist der Algo durchgefallen.
Wenn nein, dann bedeutet das zumindest, dass die Zahlen auf den ersten Blick etwas taugen könnten, ist aber kein Beweis, dass sie wirklich gut sein ("Absence of evidence isn't evidence of absence.")

Wäre eine Liste mit 1 000 000 mal 1 und 0 fürs Erste auch ok?
Wenn nicht, aus welchem Range sollen die 10 Mio kommen; 0 bis ... ?

HajottV
2014-07-08, 13:31:10
Bitte in der Form, in der Du intern rechnest, d.h. wenn Du 64 Bit Zahlen benutzt, dann bitte auch die 64 Bit rausgeben.

Osmoses
2014-07-08, 14:09:26
Kleiner Nachtrag:
Ergebnis:

true : false -- 8 : 1

true : false -- 6 : 3

true : false -- 3 : 6

true : false -- 4 : 6

Nun die Anzahl der Würfe auf 1000 gesetzt:

true : false -- 487 : 513

true : false -- 514 : 486



Die Ergebnisse habe ich von der Shell kopiert. Die kursiven Ergebnisse ergeben in Summe 9 und stammen aus einer Version, in der versehentlich 9 statt 10 mal ein Wurf durchgeführt wurde.

Bitte in der Form, in der Du intern rechnest, d.h. wenn Du 64 Bit Zahlen benutzt, dann bitte auch die 64 Bit rausgeben.

10 Mio Seeds senden oder 10 Mio Zufallszahlen, basierend auf den Seeds?

HajottV
2014-07-08, 15:11:52
Was ist denn die Ausgabe von Deiner Software? Eine Seed? Einen Strom von Seeds? Was ist für Dich der Unterschied zwischen Seed und Zufallszahl?

Osmoses
2014-07-08, 17:36:36
Hm, also bevor wir da weiterreden, muss ich einem Phänomen auf die Schliche kommen:

Am Quadcore Development-PC unter Win 8.1.1, in einer VM und am 6-Core i7 kommt immer annähernd 50:50 raus.

Am 4-Core i7 vom Laptop mit Win 7 kommen 30:70 Verteilungen - und zwar bei allen 8 Threads - raus :confused:
Das .java file wurde am Development-PC mit der 7er JDK kompiliert und das file von dort auf alle weiteren Rechner transferiert.

Die Ergebnise vom Core2 Laptop meiner Frau passen dagegen wieder super rein!

Ich finde diesen Ausreißer wirklich merkwürdig.
Wobei aber der Laptop i7 mit Win 7 fährt, der Rest mit Win 8.1.1.

Ob es daran liegt?? Kann ja nicht sein eigentlich - oder?

Pinoccio
2014-07-08, 20:51:12
Kann ja nicht sein eigentlich - oder?Vielleicht ist einfach das passiert, was einige/alle dir hier seit Anfang an mitteilen wollen: Guter Zufall ist verdammt schwierig. Und etwas Mathe aus dem Physikstudium reicht da nicht, weil man da die falschen Sachen lernt.

mfg

Osmoses
2014-07-08, 23:43:19
Vielleicht ist einfach das passiert, was einige/alle dir hier seit Anfang an mitteilen wollen: Guter Zufall ist verdammt schwierig. Und etwas Mathe aus dem Physikstudium reicht da nicht, weil man da die falschen Sachen lernt.

mfg

Hm, nein - das Problem ist wo anders gelegen und ich bin gerade am Beseitigen.

Problem gelöst.

Also - wo waren wir? :-)

EPIC_FAIL
2014-07-09, 01:07:23
Hm, nein - das Problem ist wo anders gelegen und ich bin gerade am Beseitigen.

Problem gelöst.

Also - wo waren wir? :-)

Poste den Code, dann können wir eine Kryptoanalyse machen. Das ist Usus bei solchen Sachen.

Ganon
2014-07-09, 08:35:04
Also - wo waren wir? :-)

Du bist hier nicht in einem Telefongespräch... du kannst einfach hochscrollen und die Fragen beantworten, die dir gestellt wurden, statt indirekt zu Fragen ob jemand noch Fragen hat...

Und poste einfach den Code und lasse ihn stehen/halte ihn aktuell. Stelle ihn unter GPL oder sonstwas, dann geht auch dein Name nicht verloren. Ohne mathematischen Beweis wird sich eh kaum einer dafür interessieren.

PatkIllA
2014-07-09, 08:50:02
So langsam glaube ich an Trolling.
Der ganze Ansatz anhand von der Rechenzeit was zufälliges erwarten zu wollen kann doch schon nicht klappen. Soviel Kryptoanalyse traue ich mir auf jeden Fall zu.

Osmoses
2014-07-09, 09:10:40
Code kommt gegen Mittag.
GPL gefällt mir nicht - werde einfach vorerst "nur" als quelloffene Freeware einstellen.

Osmoses
2014-07-09, 12:58:57
Code kommt gegen Mittag.
GPL gefällt mir nicht - werde einfach vorerst "nur" als quelloffene Freeware einstellen.

Mahlzeit!

Code ist im Einleitungsposting (https://www.forum-3dcenter.org/vbulletin/showthread.php?t=554939) zu finden.

Gast
2014-07-09, 13:05:48
Mahlzeit!

Code ist im Einleitungsposting (https://www.forum-3dcenter.org/vbulletin/showthread.php?t=554939) zu finden.
Setzen, 6!
Das kann ja kein Mensch lesen.

del_4901
2014-07-09, 13:15:28
y, /* Ergebnis der Funktion in der Testkurven; Wird nicht mehr gebraucht im weiteren Verlauf */
Das denkt sich der Compiler auch...

Osmoses
2014-07-09, 13:24:54
Setzen, 6!
Das kann ja kein Mensch lesen.

Bin ich froh, dass ich in Österreich lebe und hier "6" keine Note ist.
Ansonsten möchte ich dir, lieber Gast, noch mitgeben, dass du deine Kritik in Zukunft vielleicht konstruktiv verfasst - sonst fängt man damit nämlich nicht viel an ;)

Das denkt sich der Compiler auch...
:)

Ganon
2014-07-09, 13:36:55
Und was hat das Ganze jetzt mit Zufallszahlen zu tun? Du hast auch noch so einige Fragen nicht beantwortet...

Die Zeitdistanz zu nehmen, wie lange ein bestimmter Minimalcode braucht ist auch äußerst schlecht. Denn dieser hat nur einen eingeschränkten Bereich wie er sein kann. Die meisten heutigen PCs werden den Kram je nach Setting schneller ausrechnen als dir das gewisse Timer überhaupt liefern. Und selbst wenn, der Suchbereich beläuft sich auf wenige Nano bis Millisekunden.

Und nur weil du Java und System.nanotime() nimmst, heißt das nicht, dass dein Code plattformunabhängig ist. Denn die Doku sagt: "Es liefert dir den genauesten Timer der Plattform"... das bedeutet nicht, dass der Timer da im Bereich von Nanosekunden genau ist. Da kann auch ein Millisekunden-Timer rauskommen und dir bricht dein ganzer Plan zusammen, weil jeder Durchlauf auf dieser Plattform sagt "16ms" oder "0 ms", weil es nicht genauer geht.

Ganon
2014-07-09, 13:45:05
:)

Ich denke du verstehst ihn falsch ;)

Was dein Problem ist: Du baust Sachen die hinterher überhaupt nicht benutzt werden. Java macht das vllt. noch mit, aber andere Compiler werden dir "Code der nur Zeit verbrennt und nicht verwendet wird" einfach rausoptimieren und deine Laufzeit wird immer 0 sein. Der HotSpot-Compiler wird dir das nach ein paar Minuten Laufzeit vllt. auch antun, je nachdem was für Optimierungen dann greifen.

Exxtreme
2014-07-09, 13:53:47
:)
Bedeutet eher, dass diese Variable gar nicht benutzt wird weil der Compiler das wegoptimiert wenn er merkt, dass das gar nicht wirklich gebraucht wird. Compiler sind da recht tricky was das angeht sobald man die Optimierungen einschaltet. Und dann generieren sie nicht unbedingt einen Code, der das tut was man programmiert hat sondern einen äquivalent funktionierenden Code, der am Ende gleiche Ergebnisse liefert.
Aus einer Multiplikation macht er u. U. einen bit shift etc.

Da kann man böse stolpern. ;)

Asaraki
2014-07-09, 13:54:14
Mal davon abgesehen, dass sowas z.B. in 5 Jahren dann komplett "Banane" ist, weil Intel irgendwas revolutionäres baut und diese Berechnungen unterhalb der messbaren Zeit ausführt.

Ganon
2014-07-09, 14:00:33
Mal davon abgesehen, dass sowas z.B. in 5 Jahren dann komplett "Banane" ist, weil Intel irgendwas revolutionäres baut und diese Berechnungen unterhalb der messbaren Zeit ausführt.

"Jetzt neu, der Überlichtprozessor" :D

Messen wirst du es schon können (plattformabhängig), aber es ist halt "zum Knacken" relativ egal, ob man es nun mit 1,2,3,4 oder 5 ns mal fix ausprobiert ;)

Osmoses
2014-07-09, 14:06:11
Vorweg ein paar Worte zum Ton hier:
Einige Beiträge haben mMn einen aggressiven Unterton.
Sowas sollte bei einem Thema wie diesem unter erwachsenen Menschen nicht nötig sein.

Danke.

Und was hat das Ganze jetzt mit Zufallszahlen zu tun? Du hast auch noch so einige Fragen nicht beantwortet...


Welche Fragen?
Bitte stell sie explizit und ich werde so gut ich kann antworten.

Ich denke du verstehst ihn falsch ;)

Was dein Problem ist: Du baust Sachen die hinterher überhaupt nicht benutzt werden. Java macht das vllt. noch mit, aber andere Compiler werden dir "Code der nur Zeit verbrennt und nicht verwendet wird" einfach rausoptimieren und deine Laufzeit wird immer 0 sein. Der HotSpot-Compiler wird dir das nach ein paar Minuten Laufzeit vllt. auch antun, je nachdem was für Optimierungen dann greifen.

Ich habe ihn schon richtig verstanden.
Aktuell wird es nicht wegoptimiert und sollte es der Fall sein, dann wird eben y irgendwo kurz ausgegeben.
Oder ich finde eine andere Lösung.

Das Ding befindet sich ja noch in der Entwicklung und ist noch lang nicht fertig.

Bedeutet eher, dass diese Variable gar nicht benutzt wird weil der Compiler das wegoptimiert wenn er merkt, dass das gar nicht wirklich gebraucht wird. Compiler sind da recht tricky was das angeht sobald man die Optimierungen einschaltet. Und dann generieren sie nicht unbedingt einen Code, der das tut was man programmiert hat sondern einen äquivalent funktionierenden Code, der am Ende gleiche Ergebnisse liefert.
Aus einer Multiplikation macht er u. U. einen bit shift etc.

Da kann man böse stolpern. ;)

Danke für den Input - werde dies in Zukunft berücksichtigen.

Mal davon abgesehen, dass sowas z.B. in 5 Jahren dann komplett "Banane" ist, weil Intel irgendwas revolutionäres baut und diese Berechnungen unterhalb der messbaren Zeit ausführt.

In 5 Jahren sind wir auch alle tot, weil eine globale Katastrophe die Menschheit ausradiert.
Oder in 5 Jahren habe ich geklonte Schafe, welche meine Arbeit machen.
Oder ...

Ich geh mal die Glaskugel polieren ;D

Ganon
2014-07-09, 14:11:09
Einige Beiträge haben mMn einen aggressiven Unterton.
Sowas sollte bei einem Thema wie diesem unter erwachsenen Menschen nicht nötig sein.

Das liegt daran, weil du ständig Fragen ignorierst und ebenso Anmerkungen zu deiner Arbeitsweise... darum nimmt dich halt keiner Ernst, weil du offensichtlich nicht so richtig verstehst was du da eigentlich tust.


Welche Fragen?


Na z.B:
HajottV:
Was ist denn die Ausgabe von Deiner Software? Eine Seed? Einen Strom von Seeds? Was ist für Dich der Unterschied zwischen Seed und Zufallszahl?

HajottV:
Vorschlag: Du legst mal auf Dropbox eine gezippte Liste mit 10 Millionen fortlaufenden Zufallszahlen nach Deinem Algorithmus, und dann lass mal sehen, ob man da nicht Struktur drin findet

Coda:
Was willst du überhaupt bezwecken?


Nur um ein paar zu nennen ;)


Ich habe ihn schon richtig verstanden.
Aktuell wird es nicht wegoptimiert und sollte es der Fall sein, dann wird eben y irgendwo kurz ausgegeben.
Oder ich finde eine andere Lösung.


Das ist ebenso keine gute Grundlage für einen Algorithmus...

del_4901
2014-07-09, 14:17:31
Aktuell wird es nicht wegoptimiert und sollte es der Fall sein, dann wird eben y irgendwo kurz ausgegeben.Vergiss dabei nicht die Zeit welche printf benoetigt mit zu messen... :ugly:

Osmoses
2014-07-09, 14:26:19
Das liegt daran, weil du ständig Fragen ignorierst und ebenso Anmerkungen zu deiner Arbeitsweise... darum nimmt dich halt keiner Ernst, weil du offensichtlich nicht so richtig verstehst was du da eigentlich tust.


Toll - trotzdem muss man irgendwie anfangen und wenn man sich von einem "Das wird nix!" einschränken lässt, ist man selbst schuld.
Aus Fehlern lernt man, aber wem dies nicht passt, der sollte sich vielleicht einem anderen Thread widmen.


Na z.B:
HajottV:
Was ist denn die Ausgabe von Deiner Software? Eine Seed? Einen Strom von Seeds? Was ist für Dich der Unterschied zwischen Seed und Zufallszahl?


Das Programm macht Münzwürfe und die werden anhand einer Zufallszahl berechnet.
Was man damit in Zukunft noch anstellt werde ich noch sehen.

Die Würfe passen schon mal gut in der Verteilung.


HajottV:
Vorschlag: Du legst mal auf Dropbox eine gezippte Liste mit 10 Millionen fortlaufenden Zufallszahlen nach Deinem Algorithmus, und dann lass mal sehen, ob man da nicht Struktur drin findet


Mache ich schon noch - sobald ich meine das Programm tut was ich will.


Coda:
Was willst du überhaupt bezwecken?


Mein Wissen erweitern.


Nur um ein paar zu nennen ;)


Fein, damit ist jetzt einiges beantwortet. :rolleyes:

Wobei mir ehrlich gesagt langsam die Lust vergeht :freak:

Asaraki
2014-07-09, 14:28:29
In 5 Jahren sind wir auch alle tot, weil eine globale Katastrophe die Menschheit ausradiert.
Oder in 5 Jahren habe ich geklonte Schafe, welche meine Arbeit machen.
Oder ...

Ich geh mal die Glaskugel polieren ;D

Wir reden hier aber von Software Engineering und nicht von Karten legen. Es gibt Dinge die du absehen kannst und die deine Software tangieren können, das sollte dann imho auch berücksichtig werden.

Es geht dabei weniger darum, wie wahrscheinlich es ist, dass dieses Ereignis schon bald eintritt, sondern darum, den Code zu bauen, dass es keine Rolle spielt ob das Ereignis eintritt.

Z.B: Was passiert wenn du in 500ms mehr Berechnungen durchführen kannst, als dein Long hält? Wie könntest du dies umgehen, so dass es nicht vorkommen kann... u.s.w

Osmoses
2014-07-09, 14:37:35
Wir reden hier aber von Software Engineering und nicht von Karten legen. Es gibt Dinge die du absehen kannst und die deine Software tangieren können, das sollte dann imho auch berücksichtig werden.

Es geht dabei weniger darum, wie wahrscheinlich es ist, dass dieses Ereignis schon bald eintritt, sondern darum, den Code zu bauen, dass es keine Rolle spielt ob das Ereignis eintritt.

Z.B: Was passiert wenn du in 500ms mehr Berechnungen durchführen kannst, als dein Long hält? Wie könntest du dies umgehen, so dass es nicht vorkommen kann... u.s.w

Gerade der letzte Teil "500ms mehr Berechnungen durchführen kannst, als dein Long hält" beschäftigt mich atm.

Ganon
2014-07-09, 14:41:07
Mein Wissen erweitern.

Und genau das vermeidest du aktiv, da dir jeder schon klar dargelegt hat, dass dein Vorgehen einfach in eine Sackgasse führt und schlicht der falsche Weg ist.

Du beharrst weiter auf deiner "Idee" und willst auf Krampf alle Nachteile auf irgendwelche magische Art und Weise umschiffen.

Dein Wissen würdest du erweitern, wenn du dir einfach mal produktiv eingesetzte Zufallszahlengeneratoren anschauen würdest.

Exxtreme
2014-07-09, 15:01:32
Danke für den Input - werde dies in Zukunft berücksichtigen.



In 5 Jahren sind wir auch alle tot, weil eine globale Katastrophe die Menschheit ausradiert.
Oder in 5 Jahren habe ich geklonte Schafe, welche meine Arbeit machen.
Oder ...

Ich geh mal die Glaskugel polieren ;D
Unterschätze das bitte nicht. Windows 98 hat einen Bug, dass es nicht mehr hochfährt wenn die CPU zu schnell ist. Dort hat sich Microsoft halt auf eine bestimmte Laufzeit bestimmter CPU-Instruktionen verlassen. Ich sehe allgemein solche Konzepte, die auf irgendwelchen Laufzeiten basieren als sehr sehr sehr mit Vorsicht zu geniessen an. Und grad die JVM mit Hotspot ist hier noch viel unberechenbarer als statische Kompilierung.

Osmoses
2014-07-09, 16:01:00
Unterschätze das bitte nicht. Windows 98 hat einen Bug, dass es nicht mehr hochfährt wenn die CPU zu schnell ist. Dort hat sich Microsoft halt auf eine bestimmte Laufzeit bestimmter CPU-Instruktionen verlassen. Ich sehe allgemein solche Konzepte, die auf irgendwelchen Laufzeiten basieren als sehr sehr sehr mit Vorsicht zu geniessen an. Und grad die JVM mit Hotspot ist hier noch viel unberechenbarer als statische Kompilierung.

Sicher Wndows 98?
War es nicht 95 in Verbindung mit (AMD K6-X) CPUs mit 300MHz und mehr?
AFAIK hatte ich Win 98 von 133MHz bis 1,2GHz im Einsatz :)

Osmoses
2014-07-09, 16:03:59
Und genau das vermeidest du aktiv, da dir jeder schon klar dargelegt hat, dass dein Vorgehen einfach in eine Sackgasse führt und schlicht der falsche Weg ist.

Du beharrst weiter auf deiner "Idee" und willst auf Krampf alle Nachteile auf irgendwelche magische Art und Weise umschiffen.

Dein Wissen würdest du erweitern, wenn du dir einfach mal produktiv eingesetzte Zufallszahlengeneratoren anschauen würdest.

Ich will es einfach probieren.
Aber gut - wenn mir dies als Beratungs- bzw. Lernresistenz ausgelegt wird, dann sollte ich aufhören den Thread weiterzuverfolgen.

Wäre schade, denn der bisherige konstruktive Input hat mein Wissen schon sehr erweitert.

Exxtreme
2014-07-09, 16:27:39
Sicher Wndows 98?
War es nicht 95 in Verbindung mit (AMD K6-X) CPUs mit 300MHz und mehr?
AFAIK hatte ich Win 98 von 133MHz bis 1,2GHz im Einsatz :)

Stimmt, Windows 95 war's. Windows 98 hat da einen anderen Bug.

http://www.heise.de/ct/hotline/Windows-Probleme-mit-AMD-K6-Prozessoren-306730.html

Aber ich hoffe, das verdeutlicht die Problematik, die man sich unter Umständen damit einfängt wenn man auf bestimmte Laufzeiten hofft. =)

#44
2014-07-09, 16:34:44
Ich will es einfach probieren.
Bei Krypto - und da gehört guter Pseudozufall dazu - gilt: Studieren geht über probieren.

Du zäumst das Pferd einfach von hinten auf, wenn du mit dem Coden anfängst.
Ich würde glatt wetten, dass die Meisten hier selbst kein Expertenwissen vorweisen können sondern ggf. nur vor Jahren mal ne Vorlesung zum Thema hatten. Oder mit der Zeit dies und das so aufgeschnappt haben.

Und trotzdem sehen sie sofort, dass das was du tust problematisch ist.
Es hapert einfach an den absoluten Grundlagen.

Wenn du es ernst meinst, dann lies dich ein.

Asaraki
2014-07-09, 16:37:38
Ich will es einfach probieren.
Aber gut - wenn mir dies als Beratungs- bzw. Lernresistenz ausgelegt wird, dann sollte ich aufhören den Thread weiterzuverfolgen.

Wäre schade, denn der bisherige konstruktive Input hat mein Wissen schon sehr erweitert.

Nein, nicht _dass_ deine Idee höchstwahrscheinlich in die Sackgasse führt, sondern dass du den Input nicht konstruktiv aufnimmst und z.B. nochmal zurück ans Design gehst, die Probleme erkennst und z.B. nach Lösungen fragst.

Stattdessen redest du von nebensächlichen Problemen ohne das Hauptproblem deines Ansatzes anzugehen. Ich kenne das halt gut aus der Entwicklung, man verrennt sich gerne in etwas. Aber wenn du lernen willst, dann ist die Methodik der Entwicklung das erste, was auf deiner Liste stehen sollte. Wenn dein Problem grundsätzlicher Natur ist, nämlich dass du noch keinen theoretischen Beweis für deinen Ansatz hast, dann solltest du auch dort anfangen.

Einer meiner Leitsätze (Ausnahmen bestätigen die Regel) ist : Und nie sollst du es wagen, eine Zeile Code zu schreiben, bevor du es wirklich, wirklich... WIRKLICH verstanden hast.

Just my 2 cents, aber ich entwickle ja auch noch nicht lange ^^

P.S: Ach ja, noch etwas aus dem Erfahrungsschatz. Das Ego lässt man an der Tür, wenn man einen Raum betritt, in welchem seine Designs und sein Code begutachtet wird. Du willst nicht wissen, wieviele Codereviews ich schon gemacht habe wo der Entwickler nahe am Zusammenbruch war, einfach weil weder Reviewer noch Author wissen, wie man richtig kommunziert und zuhört. Niemand hier greift dich persönlich an, und wenn er das tut kann er gerne meinen Allerwertesten lecken und du ganz locker darüber stehen, aber es war schon meist so, dass der Ton bei solchen Dingen sehr direkt und manchmal hart ist. "That's bullshit. Never gonna work. Did you even proof that first? But this has obviously not been tested". Einfach mal eine Folge Hells Kitchen schauen, dann weisst du dich worauf du dich einlässt :D

HajottV
2014-07-09, 16:39:30
So, ich habe das jetzt mal laufen lassen...

die Seeds...

715486.3504012394
653248.686809525
631243.6133640589
633641.0000531981
653596.5321401559
652111.2527849012
645850.5239030462
649542.9958652776
636011.0409411517
663706.6109200292
622801.6197103378
649304.367985198
649809.2197970137
...

Die daraus berechneten Münzwürfe...

Wurf: false
Wurf: false
Wurf: true
Wurf: true
Wurf: false
Wurf: true
Wurf: false
Wurf: false
Wurf: true
Wurf: false
Wurf: true
Wurf: false
Wurf: true
Wurf: false
Wurf: false
Wurf: false
Wurf: false
...

Ich würde mal sagen:

wurf = ((int) Math.floor(seed)) & 1 == 1

Oder in Worten:

Wenn man die Seed durch weglassen der Nachkommastellen in eine Ganzzahl umwandelt, dann ist Wurf genau dann true, wenn Seed ungerade ist.

Der Code dazu bestätigt das:


c=-1;
for( x = 0; x < s; x++)
{
c=(c+1);
d=false;
if (c>=2)
c=0;
else
d=true;
}


... ist ein Beispiel für "security through obscurity".

Wenn man sich den Code man anguckt, dann sieht man auch direkt einen möglichen Angriff auf das Verfahren:


b = 0;
z = 0;
t = System.nanoTime();
*
while (z < 500000000)
{
z = System.nanoTime() - t;
b = (b + 1);
a = (5*b*b-3*b*b*b*b-20);
}


Hier versuchst Du, Deine Initialseeds zu bestimmen.
Nun stellt sich die Frage: Wie kann man das von außen manipulieren? Antwort: ich stelle sicher, dass Dein Programm an der Stelle, die mit * markiert ist, eingefroren wird und zwar für 500ms. Dazu gibt es verschiedene Möglichkeiten... angenommen ich kann Dein Programm nicht direkt per Debugger etc. anhalten, was könnte ich machen, um sicherzustellen, dass Dein Programm nicht voran kommt? Nun, ich könnte z.B. die Kiste dadurch völlig überlastet, indem ich parallel mit 100 Prozessen ein UHD-Video kodieren lasse. Die Chance, dass Dein Programm dann keine Rechenzeit bekommt, ist ziemlich groß. Als Ergebnis geht Dein Seeding aus der Schleife und zwar mit dem Wert b = 1, woraufhin Dein Algorithmus ein paar zeilen darunter mit einem DivisionByZero wegkracht (siehe Zeile 72: x = -1, b = 1).

Ich breche das jetzt ab, weil es keinen Sinn macht, das weiter zu sezieren.

Hier wurde damit nun wirklich guter Wille demonstriert, und ich habe 30 Minuten Zeit dafür eingesetzt, weil ich bei Dir viel Ethusiasmus sehe. Mehr werde ich aber nicht investieren.

Sofern Du wirklich an Kryptografie interessiert bist, dann kauf Dir ein gutes Buch dazu. Aber Achtung: mach Dich bereit für viel Algebra, Zahlentheorie und Statistik...

Asaraki
2014-07-09, 16:46:01
Hier wurde damit nun wirklich guter Wille demonstriert, und ich habe 30 Minuten Zeit dafür eingesetzt, weil ich bei Dir viel Ethusiasmus sehe. Mehr werde ich aber nicht investieren.
..

Ich würd dir sofort ein +1 oder ein Thanks geben, wenn das hier möglich ist. Ich hoffe der TS würdigt deine Zeit, die du hier eingesetzt hast. Sehr lieb von dir.

Das mit dem Enthusiasmus sehe ich übrigens auch so, niemand unterstellt dem TS hoffentlich mangelnde Motivation. Mich persönlich schmerzt es einfach, wenn ich sehe wie sich jemand völlig verrennt, weil es garantiert mit Frust endet.

Osmoses
2014-07-09, 17:12:42
Asaraki:

Danke für die Worte; ist angekommen.

HajottV:

Fein.
Wirklich fein.

Tolle Ausführung :up:

Du hast natürlich absolut recht und ich bin dir dankbar für die investierte Zeit!

Beschissen gelaufen für meine Idee, aber damit bin ich einen Schritt weiter.
Auch wenn ich mich jetzt natürlich nicht freue ...

Damit werde ich wohl das Vorhaben endgültig auf Eis legen.

Cheers!