Laden...

Eric Lippert über Math.random

Erstellt von Palin vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.299 Views
P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 6 Jahren
Eric Lippert über Math.random

Eric Lippert hat bei stackoverflow zur Frage 'Why is Math.random() not designed to be cryptographically secure?' geantwortet . (In JavaScript aber auf .Net wird auch kurz eingegangen)
Ich finde die Antwort ganz interessant.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Palin,

ja interessant, aber so hab ich das historisch auch erwartet (ich kannte die Hintergründe und Motivation dazu vorher nicht).

In .net würde ich System.Random auch nicht anders implementieren. * Pseudo-Zufallszahlen reichen für viele Anwendungen

  • durch die Angabe eines Seeds ist die generierte Zufallsfolge deterministisch -- v.a. ein Vorteil wenn es um das Reproduzieren von Ergebnissen geht (Debuggen, Testen)
  • ist effizienter als kryptografische Zufallszahlen (wenn keine Hardwareunterstützung dafür vorhanden ist und diese genutzt wird)

In der Doku zu System.Random steht auch

Zitat von: Random Class
Represents a pseudo-random number generator

mit Verweis auf kryptografische Zufallsgeneratoren. Es sollte somit keiner in diese "Falle" tappen, der die Doku gelesen hat.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 6 Jahren

Das es in der Doku steht ist natürlich hilfreich. Noch besser wäre es natürlich, wenn aus dem Namen der Funktion direkt hervorging was sie mach. Eric hat da ja "pseudorandom" als Verbesserung Vorgeschlagen. Und Random ist ja so eine von den Funktionen, bei dehnen Leute mal häufiger reinfallen.

In den Kommentaren sind noch ein paar Beispiele von Eric wie Random Probleme machen kann.

Ich persönlich bin mit der Random Funktion ganz zufrieden.
Ich finde es mach mal ganz interessant, was Entwickler über ihre Arbeit von vor 20 Jahren sagen.

Wenn ich da an mich denke ich hab da grade in meinen HiWi angefangen F# zu lernen mit einen einfachen Text Editor (kein Syntax Highlightning oder ähnliches) und bei dem ersten bisschen größeren Projekt, hab ich erst mal eine Woche durch Programmiert ohne auch nur einmal zu Compilieren. Die nächsten Wochen habe ich, dann mit Fehler suche zugebracht. Wäre deutlich sicher schneller gewesen, alles noch mal neu zu schreiben.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

16.807 Beiträge seit 2008
vor 6 Jahren

Und Random ist ja so eine von den Funktionen, bei dehnen Leute mal häufiger reinfallen.

Weil keine 5 % die Doku lesen.
Am Namen ist auch nichts auszusetzen.... sie macht genau das, was sie machen soll.

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Palin,

wenn wir von der .net-Variante sprechen, so ist Random eine Klasse und keine function. Und von dieser Klasse kann abgeleitet werden, daher wäre hier eine Bezeichnung ala "PseudoRandom" hinderlich, wenn z.B. eine True-Random Implementierung abgeleitet wird.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 6 Jahren

Am Namen ist auch nichts auszusetzen.... sie macht genau das, was sie machen soll.

Schauen wir mal was Eric dazu sagt. (Mal ein paar stellen hervorgehoben.)

First off: the design of many RNG APIs is horrible. The fact that the .NET Random class can trivially be misused in multiple ways to produce long sequences of the same number is awful. An API where the **natural way to use it is also the wrong way **is a "pit of failure" API; we want our APIs to be pits of success, where the natural way and the right way are the same.

I think it is fair to say that if we knew then what we know now, the JS random API would be different. Even simple things like changing the name to "pseudorandom" would help, because as you note, in some cases the implementation details matter. At an architectural level, there are good reasons why you want random() to be a factory that returns an object representing a random or pseudo-random sequence, rather than simply returning numbers. And so on. Lessons learned.

Ich denke da wieder spricht er dir.

@gfoild
Du hast natürlich recht es ist eine Klasse und von der kann man auch Erben. Aber wenn jemand eine Klasse TrueRandom ableitet, sollte er auch dafür Sorgen, das er die Methoden Passend überschreibt so, das wirklich Zufallszahlen generiert werden. Ich könnte ja auch eine Klasse erstellen die EvenRandom heißt, von der würde ich erwarten, das sie mir nur grade Zahlen zurück liefert.

Bei DI wäre es natürlich unschön, so was wie

MyClass(PseudoRandom  random) 

zu haben.

Schöner wäre das so was wie

MyClass(IRandomGenerator randomGenerator)

zu haben.

Mir ging es jetzt hier aber nicht darum zu Diskutieren, wie man die Random Klasse implementieren kann.

Ich persönlich fand den selbstkritischen Umgang von Erik sehr gut (und ja der Rückblick war auch ganz interessant). Er hätte ja genau so gut sagen können Random macht genau was es soll, schau in die Doku, wenn du es falsch Nutzt bist du zu dumm.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

16.807 Beiträge seit 2008
vor 6 Jahren

Die Klasse macht genau das: deterministisch Zufallszahlen zurück geben.
Sie hat den Namen Random verdient.

Versteh mal seinen Text bitte richtig:
Ihm geht es eigentlich nicht um das Naming oder um das Generieren per se, sondern dass die Klasse per default einen Zufalls-Seek auswählen sollte - und nicht umgekehrt, wie es heute ist.

Den natural way of usage hat damals nicht nur das .NET Team nicht immer befolgt.
Das hat leider viele Sprachen damals betroffen - und das zieht sich halt durch.

Ich find das ehrlich gesagt auch nicht so spannend.
Einfach mal Mads Torgersen zuhören, wie er über (seine) Design Fehler von C# redet - finde ich jetzt deutlich spannender.

T
2.219 Beiträge seit 2008
vor 6 Jahren

@Abt
hast du dafür einen Link parad?
Würde ich mir gerne mal anhören wollen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
985 Beiträge seit 2014
vor 6 Jahren

Die Naming-Aussage von Eric bezieht sich auf JS Math.random(), also der Methodenname hätte anders lauten sollen.

Zum Namen der C# Random Klasse lässt er sich gar nicht aus.

BTW. Der gute Kollege heisst Mads Torgersen 😁

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 6 Jahren

Zum Namen der C# Random Klasse lässt er sich gar nicht aus.

Explizit nicht, aber ich denke es ist schon recht klar das seine Aussagen es Implizieren.

....NET Random class can trivially be misused …

Die Klasse macht genau das: deterministisch Zufallszahlen zurück geben.
Sie hat den Namen Random verdient.

Sieht Eric anders.

Lessons learned.

Ein Link zu Mads Torgersen fände ich auch interessant.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

16.807 Beiträge seit 2008
vor 6 Jahren

Whew.. schade, dass Du Erics Text einfach nicht verstehst oder verstehen willst.
Es geht im immer noch nicht maßgeblich um den Namen, sondern um den Inhalt. Den Namen erwähnt er nur nebenbei.
Aber gut, bringt hier wohl nichts das noch und nochmal zu erklären... auch die Info von Sir Rufo scheinst Du auch einfach nur aktiv ignorieren zu wollen.

Edit: Letzter Versuch, dass Du es vielleicht doch verstehst:

Die Klasse macht genau das: deterministisch Zufallszahlen zurück geben.
Sie hat den Namen Random verdient.

Sieht Eric anders.

Nein, tut er nicht.
Ihm geht es prinzipiell in seinem Text um den Inhalt, dass die Klasse eben deterministisch ist (per default) und nicht wirklich den Zufall erzeugt.
Er hätte es lieber, dass sie per default (ohne Parameter) wirklich einen Zufall erzeugt und nur mit einem Seed deterministisch ist.
> natural usage.

> Google-Suche nach Mads Torgersen

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 6 Jahren

Ja ihm geht es Zentral um die Implementierung, aber er ist auch der Meinung das eine Namens Änderung es besser machen würde

Even simple things like changing the name to "pseudorandom" would help

Die Grundlegende aussage des Testes ist eigendlich nicht schwer zu Verstehen.

First off: the design of many RNG APIs is horrible. The fact that the .NET Random class can trivially be misused in multiple ways to produce long sequences of the same number is awful.

Und

Lessons learned

Er gibt offen zu das er einen Fehler gemacht hat, aber auch das er auch dem Fehler gelernt hat (Lessons learned).

Im 2. Teil erklärt er wie so die Klasse so ist. Und dafür gab es in den 90gern gute Gründe.

Make the monkey dance when you move the mouse.

Ist auch OK, aber da hinein zu Interpretern 2018 meint Eric das die Klasse macht was sie soll und der Name ist Richtig, sehe ich nicht im Ansatz. Oder um ihn wiederholt zu Zitieren.

First off: the design of many RNG APIs is horrible. The fact that the .NET Random class can trivially be misused in multiple ways to produce long sequences of the same number is awful.

Wenn du eine andere Aussage in seinem Text siehst, belege sie doch bitte mal an Hand von Zitaten.

Auf Sir Rufos Aussage bin ich auch eingegangen.
Ich hoffe das die meisten wissen was Explizit und Implizit bedeuten.

p.s.
Ich hoffe das dir klar ist, das T-Virus und ich nicht meinten, einfach den Namen Mads Torgersen in google ein zugeben.
Sondern einen Link zu bekommen in dem er über

Einfach mal Mads Torgersen zuhören, wie er über (seine) Design Fehler von C# redet - finde ich jetzt deutlich spannender.

redet.

Aber da haben wir uns vielleicht nicht Explizit genug ausgedrückt und du hast Impliziert, das wir den Namen nicht googeln können.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern