Funktion die mir fuer einen String eine Zahl zwischen 0.0 und 1.0 zurueckliefert..?

sirbender

Top Contributor
Hallo,

ich suche eine Funktion die mir fuer einen String eine Zahl zwischen 0.0 und 1.0 zurueckliefert. Ich will diese Zahl in Tests verwenden, deswegen sollte sie fuer alle Ewigkeiten (auch bei anderer JRE version bzw. Hersteller der JRE) gleich bleiben.
Wenn ich dann z.B. den String via getBytes umwandle habe ich dann z.B. Bammel, dass durch das verwendete CharSet in Zukunft das Ergebnis anderst wird. Ich denke aber, dass ich durch Spezifikation des CharSet "UTF-8" auf der sicheren Seite bin?

Auch z.B. die Verwendung von Math.sin um den Wert zwischen 0..1 weiter zu normalisieren halte ich im Moment fuer Problematisch. Wer weiss wie Math.sin in Zukunft implementiert wird. Dadurch koennte mein Test kaputtgehen und ich suche das Problem bestimmt zuerst wo anderst.

Ein Problem ist, dass lange Strings Zahlen nahe bei 1 sind und kurze nahe bei 0.
Versuche ich dieses Problem zu beseitigen (ich normalisiere mit der laenge des String) tritt ein anderes Problem auf, naemlich, dass die Zahlen zwischen 0.0 und 1.0 nicht sehr gleichmaessig verteilt sind.

Ich will jetzt nicht meinen aktuellen Code zeigen um eure Ideen nicht zu beeinflussen. Was wuerdet ihr machen um fuer eine Liste von Strings eine Liste von Werten zwischen 0..1 zu erhalten. Die Zahlen sollten relativ gleichverteilt sein und auch nicht von der Laenge des Strings abhaengen.
 

Thallius

Top Contributor
Ich denke ohne das Du uns sagst was die Anwendung für diese Funktion sein soll, können wir auch schlecht helfen. Für mich klingt das erstmal wie eine recht sinnfreie Idee etwas zu verschlüsseln.

Gruß

Claus
 

JavaMeister

Gesperrter Benutzer
Welchen Sinn soll das haben? Und egal wie Sinus implementiert ist oder wird ich denke die Ergebnisse sind durch aus "definiert".

Könnte sein, dass es viel zu früh ist, aber mir erschließt sich das hier nicht.
 

stg

Top Contributor
Was soll überhaupt gleichverteilt bedeuten, wenn du doch komplett deterministisch ein reproduzierbares Ergebnis erhalten willst? Allein das ist doch schon total widersprüchlich.
 

Natac

Bekanntes Mitglied
Hätte jetzt folgendes Vorgeschlagen:

Java:
public static double between0And1(final String s) {
  final int rawHash = s.hashCode(); // Hash ausrechnen
  final double hash = Math.abs(Math.max(rawHash, -Integer.MAX_VALUE)); // hash in positive Zahl <= MAX verwandeln
  return (1.0 / Integer.MAX_VALUE) * hash; // Zahl zwischen 0.0 und 1.0 berechnen 
}
Damit werden alle Hash-Werte auf einen Zahlenraum zwischen 0 und 1 umgelegt.

Zugegeben werden rawHash=-2147483648 und rawHash=-2147483647 beide zu hash=2147483647, aber ich denke diesen "Schnitzer" in der Verteilung kann man ignorieren, da der positive und negative Zahlenraum von int eben einfach nicht symetrisch ist.
 
Zuletzt bearbeitet:

arilou

Bekanntes Mitglied
Also wenn sicher ist, das der String immer dieselbe Bitkombination sein wird, dann suchst du nach einer (guten) Hashfunktion. Z.B. eine CRC-Checksumme. Das geht recht schnell, und schon 1 Bit Änderung ändert die Checksumme total - damit ist eine "Gleichverteilung" sehr wahrscheinlich.

Du solltest aber dringend weg von der Idee, als Ergebnis mit Gleitkommazahlen arbeiten zu wollen. Gleitkommazahlen sind niemals "genau gleich" zu irgend etwas. Schon wenn du eine AMD-CPU anstatt einem Intel-Prozessor nimmst, oder Intel die FPU ein wenig überarbeitet, sind die letzten Mantisse-Bits in Gefahr.

Um die Gleitkomma-Probleme zu umgehen, darf man auf keinen Fall den Gleitkommawert errechnen.
Allenfalls könnte man eine Bitübertragung machen - also z.B. einen Ganzzahl-Wert direkt bitweise als Gleitkomma-Mantisse verwenden. Ein 32-Bit-'int' passt problemlos in die 52 Bit Mantisse eines 'double'.
 
Zuletzt bearbeitet:

nvidia

Bekanntes Mitglied
[...]Gleitkommazahlen sind niemals "genau gleich" zu irgend etwas. Schon wenn du eine AMD-CPU anstatt einem Intel-Prozessor nimmst, oder Intel die FPU ein wenig überarbeitet, sind die letzten Mantisse-Bits in Gefahr.

Dafür gibt es den IEEE-Standard. Und der wird von Intel/AMD und anderen unterstützt. Sonst bleiben da nur noch Fehler in der Implementierung. Da hat man in den letzten Jahren aber jetzt auch nichts mehr gelesen, Intel hatte da mal ein lustiges Problem vor Jahrzehnten ;)
 

sirbender

Top Contributor
Was soll überhaupt gleichverteilt bedeuten, wenn du doch komplett deterministisch ein reproduzierbares Ergebnis erhalten willst? Allein das ist doch schon total widersprüchlich.

Erstmal generell: es geht nicht um verschluesseln oder sowas. Ich will einen speziellen Unit-Test schreiben und die Details sind schwer zu erklaeren. Wichtig ist nur, dass der Unit-Test eine Liste von Woertern hat und ich fuer jedes Wort im Unit-Test ein double zwischen 0..1 speichere der einmalig aus dem String generiert wurde (der wird aber nicht neu generiert wenn der Unit-Test laeuft sondern wird (und muss auch) statisch in der Datei gespeichert werden).

Ja. Hast du natuerlich recht...wobei ich mich da unsauber ausgedrueckt habe. Bei den Strings handelt es sich einfach um Worte von 2-15 Zeichen Laenge aus dem Woerterbuch. Nun will ich einfach eine Zahl zwischen 0..1 aus jedem String generieren koennen. Die Liste dieser Zahlen sollte bei zufaelligen Woertern aus dem Woerterbuch auch relativ gleichmaessig den Bereich 0..1 abdecken. Und die Laenge das Strings sollte auch keine (bzw. nur eine sehr kleine) Rolle spielen fuer die Zahl die ich generiere.
 

stg

Top Contributor
Ist das Wörterbuch bekannt? Wenn ja, dann kannst du ja einfach durchnummerieren* und anschließend entsprechend auf [0..1] skalieren. Wenn du die Wörter ohnehin zufällig auswählst, dann bekommst du es auch mit komplizierteren Ansätzen nicht besser hin.

*Edit: also die möglichen Wörter des Wörterbuchs

Edit 2: Oder reden wir von beliebigen Zeichenketten? Dann landen wir wieder bei der zuvor schon getätigten Aussage, dass du einfach nur eine Hashfunktion suchst?
 
Zuletzt bearbeitet:

arilou

Bekanntes Mitglied
Dafür gibt es den IEEE-Standard. Und der wird von Intel/AMD und anderen unterstützt. Sonst bleiben da nur noch Fehler in der Implementierung.
Java unterstützt IEEE 754, ja. (Die Java-NaN's bilden nicht alle IEEE-NaNs ab.)
Die Fehler-Listen aktueller Prozessoren sind jedoch ellenlang, ob da ein Gleitkommafehler in den letzten Mantissen-Bits es "in die Öffentlichkeit schafft", ist nicht sicher.
Zwar rechnen heutige FPU normalerweise intern mit 80 Bit, gerade um Fehler aus den hinteren Mantissen-Bits heraushalten zu können, aber ob z.B. AVX auch mit 80 Bit pro 64-Bit-Wert rechnet, weis ich nicht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Hilfe bei rekursiver Funktion Java Basics - Anfänger-Themen 3
FunkyPhil94 Wert in einer Lambda Funktion erhöhen Java Basics - Anfänger-Themen 3
M Eine Funktion zuweisen Java Basics - Anfänger-Themen 3
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1
M variable in anderer funktion aufrufen Java Basics - Anfänger-Themen 10
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
J Rekursive Funktion und return statement Java Basics - Anfänger-Themen 3
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
R Buttons ohne Funktion Java Basics - Anfänger-Themen 2
I Generische Funktion Java Basics - Anfänger-Themen 3
E Pervasive PSQL insert funktion geht nicht Java Basics - Anfänger-Themen 9
C Java Funktion: externe Daten vom Internet einbinden Java Basics - Anfänger-Themen 2
T Log Funktion erstellen Java Basics - Anfänger-Themen 1
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
H Den Wert einer rekursiven Funktion bestimmen Java Basics - Anfänger-Themen 5
J In main() Datei geöffnet, von anderer Funktion beschreiben Java Basics - Anfänger-Themen 3
M toDouble Funktion Java Basics - Anfänger-Themen 3
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
X Ackermannsche Funktion Java Basics - Anfänger-Themen 32
F Arrays: Mathematische Funktion Java Basics - Anfänger-Themen 19
P Dezimal zu Hexadezimalzahl Funktion Java Basics - Anfänger-Themen 5
S Verwenden von throw Exception an der Funktion Java Basics - Anfänger-Themen 2
M Arrays in Funktion Kopieren und Bearbeiten Java Basics - Anfänger-Themen 4
B Funktion mit mehreren Rückgabewerten aka Prozeduren? Java Basics - Anfänger-Themen 12
J Dynamisches Array durch split()-Funktion? Java Basics - Anfänger-Themen 3
D Funktion nur 1 Rueckgabewert Java Basics - Anfänger-Themen 9
M Wie lang eine Funktion/Methode? Java Basics - Anfänger-Themen 51
N den inhalt eines array per funktion ausgeben Java Basics - Anfänger-Themen 8
R Ackermann Funktion Java Basics - Anfänger-Themen 2
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
N Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout, Java Basics - Anfänger-Themen 2
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
N Funktion funktioniert nicht immer Java Basics - Anfänger-Themen 6
E Contain-funktion überlisten Java Basics - Anfänger-Themen 4
J Division ohne Arithmetische Funktion Java Basics - Anfänger-Themen 2
S Funktion in Klasse auslagern Java Basics - Anfänger-Themen 4
J Problem mit Boolean bei Funktion! Java Basics - Anfänger-Themen 5
S Gibt es eine Funktion, die gewissermaßen eine Reihe von instanceOf() vereinheitlicht? Java Basics - Anfänger-Themen 19
D Nullstellen einer Funktion 3. Grades mit Horner Schema Java Basics - Anfänger-Themen 6
Aprendiendo Gibt es in der JAVA-API eine Funktion, die eine Dezimalzahl in eine binäre Zahl umwandelt? Java Basics - Anfänger-Themen 8
D Funktion gibt Dimension zurück Java Basics - Anfänger-Themen 11
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
B Zugriffe in einer Klasse / Funktion Java Basics - Anfänger-Themen 9
T Koordinatensystem zeichnen - Variablen merken? Quadratische Funktion zeichnen? Java Basics - Anfänger-Themen 5
J Array innerhalb einer Funktion mehrfach iniatilisieren Java Basics - Anfänger-Themen 4
T Lambda-Funktion bei Binärbäumen Java Basics - Anfänger-Themen 13
J Wie lässt sich der Konstruktor einer Klasse einer Funktion einer Klasse nutzen. Java Basics - Anfänger-Themen 4
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
B OOP Wie benutze ich die Main Funktion richtig? Java Basics - Anfänger-Themen 10
H Nicht Static Funktion ohne Objekt aufrufen? Java Basics - Anfänger-Themen 6
K Methoden mit den Namen accept. Welche Funktion haben diese? Java Basics - Anfänger-Themen 2
E Compare-Funktion bei eigener Klasse Java Basics - Anfänger-Themen 4
S Threads run - Funktion wird nur einmal ausgeführt. Java Basics - Anfänger-Themen 8
B Anwender soll mathematische Funktion eingeben können, Einfachster Fnktionsplotter Java Basics - Anfänger-Themen 4
R If Funktion funktioniert nicht :P Java Basics - Anfänger-Themen 3
H Funktion in Hintergrund und Vordergrund ausführen Java Basics - Anfänger-Themen 11
S Funktion eines Stacks Java Basics - Anfänger-Themen 4
T Integer-Objekt über Hash-Funktion in Array ablegen Java Basics - Anfänger-Themen 1
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
D Keine Funktion bei "else" Java Basics - Anfänger-Themen 5
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
T Klassen Funktion in einem Funktionsaufruf definieren Java Basics - Anfänger-Themen 3
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
X Eval-Funktion mit Variable Java Basics - Anfänger-Themen 2
T Screenreader Funktion Java Basics - Anfänger-Themen 2
S Wertetabelle einer Funktion f : R -> R Java Basics - Anfänger-Themen 1
P Methoden suche funktion die char wert ausgibt wenn man numerischen wert und radix angibt Java Basics - Anfänger-Themen 1
1 repaint() Funktion erzeugt Flackern Java Basics - Anfänger-Themen 33
J Taschenrechner Funktion Java Basics - Anfänger-Themen 18
R if funktion ohne else - Bedingung trifft nicht zu, ausgabe nicht nachvollziehbar Java Basics - Anfänger-Themen 7
shiroX OOP Java Funktion implementieren Java Basics - Anfänger-Themen 3
O Debug-Funktion mit Slick - Kleines Problem Java Basics - Anfänger-Themen 5
F Funktion immer zur vollen Stunde? Java Basics - Anfänger-Themen 3
S ResultSet close() in funktion nich möglich. Java Basics - Anfänger-Themen 8
C Meine erste Funktion Java Basics - Anfänger-Themen 12
J Funktion um JSON per Post senden/emfangen Java Basics - Anfänger-Themen 3
G OOP Aus Objekt auf Funktion der erzeuger Klasse zugreifen? Java Basics - Anfänger-Themen 11
D Binäre Suche für Integerarray in rekursiver Funktion Java Basics - Anfänger-Themen 5
M Interface als Konstruktorparameter nutzen, um Funktion zu plotten Java Basics - Anfänger-Themen 14
NR_EIGHT Benutzereingabe in Funktion verpacken Java Basics - Anfänger-Themen 4
J Funktion definieren und ausfuehren Java Basics - Anfänger-Themen 27
D Loop Funktion für Robot Klasse Java Basics - Anfänger-Themen 5
N mathematische Funktion Java Basics - Anfänger-Themen 29
R Programm verstehen, Funktion Java Basics - Anfänger-Themen 4
C Automatisches Ausfuehren einer Funktion beim Laden eines Jar files Java Basics - Anfänger-Themen 3
O Nicht Standard Form boolesche Funktion in Standard Form parsen Java Basics - Anfänger-Themen 3
F Sleep Funktion Java Basics - Anfänger-Themen 12
S Euklid Funktion Java Basics - Anfänger-Themen 8
H Funktion mit Argumenten Java Basics - Anfänger-Themen 5
Q Random Funktion JButtons Java Basics - Anfänger-Themen 6
O Probleme mit der repaint-Funktion Java Basics - Anfänger-Themen 6
F Eine Frage über paint() Funktion Java Basics - Anfänger-Themen 2
S Parameterübergabe - identische Funktionen, aber falsche Funktion Java Basics - Anfänger-Themen 5
C Probleme mit replaceAll Funktion Java Basics - Anfänger-Themen 9
S Vector mit beliebigen Klassen an Funktion übergeben Java Basics - Anfänger-Themen 20
C OOP Java JButton mit Funktion belegen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben