Hi,
da du direkt danach fragst, möchte ich auch deinen Code einer normalen Review unterziehen:
Die Importe sind mit angegeben aber dass package nicht. Ich gehe davon aus, dass es keine Paketstruktur gibt. Dies ist in den aller meisten Fällen schlechter Stiel und wird bereits in mittleren und großen Projekten schnell unübersichtlich.
public class R1 {
Die Benennung der Klasse ist extrem schlecht. Man kann nicht erkennen, was die Klasse tut oder in welchem Kontext sie eingeordnet ist. Mangels Paket, kann man das nichtmal versuchen abzuleiten. Das gilt gleichermaßen für fast alle deine Variablen und Methodenbezeichner.
static Random r = new Random(1000); // hält bei 1.0 an
Das ist zum formellen auch fachlich falsch. Zum einen fehlt der acceess modifier. Zum anderen hält das hier nicht bei 1.0 an. Warum auch?
return (float) (r.nextInt() >>> 1) / (float) Integer.MAX_VALUE;
Das hier liefert deswegen 10, weil durch den BIT-Shift aus -99 annährend MAX_VALUE erreicht wird. Durch einen Rundungsfehler kommt 1.0 raus. Aus dem BIT-Shift ergeben sich auch negative Zahlen, weil das höchste BIT bei „>>>“ nicht beachtet wird, bzw. mitverschoben wird.
public static float getnf2() {
Es ist komplett unklar, was diese Methode im Quellcode soll. Sie wird nicht benutzt. Das Ergebnis ist ähnlich skurill, wie das der ähnlich benannten. Es wird auch nicht beschrieben, was der Zweck sein soll.
Insgesammt versuche ich den tieferen Grund deiner Quellcodes zu entschlüsseln, aber leider ist das extrem schwer. Java und andere Programmiersprachen haben so tolle Konzepte und Frameworks mit denen man sich auseinander setzen kann.
Allen voran OOP. Du postest hier schon sol lange tollen Quellcode, aber ich vermisse da irgentwie den Progress.
Ich mein wofür ist das ganze? Welche Probleme zeigt es auf? Was ist der Sinn dahiner?
Ich gehe nicht davon aus, dass du das deswegen lernst, weil du es für den Beruf brauchst. Maximal um ein mathemtische Fragen zu klären, aber dafür sind die Postings doch recht oberflächlich.
das ist richtig. Hast du die Überschrift gelesen? Es geht um ein mathematisches Problem, also eigentlich nur um eine Zeile, und nicht um ein komplettes Review.
Ich kenn mich mit dem Zirkumflex nicht so aus… Hab doch schon versucht, alles auf das wirklich Wesentliche zu beschränken, also ein SSCCE zu schreiben.
@Marco13 : Siehst du ein Problem in der Umsetzung der Zeile?
Edit: Da ist möglicherweise eine schließende Klammer zu viel…(?)
funktional vermutlich richtig, aber vermutlich zu kompliziert - man kann eigentlich nicht sagen, eine Lösung sei falsch, ohne gleichzeitig eine bessere Alternative zu nennen - und diese seh ich bislang nicht.
Hast du dir mal angeschaut wie das alles implementiert ist? Wenn ich dich richtig verstehe, dann geht es dir ja darum, dass bei Random#nextFloat() normalerweise 1 exklusive ist, du möchtest aber 1 inklusive haben. Richtig?
Random#nextFloat() ist so implementiert: Mantisse * 2^-24, wobei für die Mantisse eine Pseudozufallszahl zwischen 0 und 2^24 (exklusive) genommen. Damit nun 1 dabei ist, musst du die Obergrenze für die Mantisse auf 2^24 + 1 setzten. Folgender Code sollte gehen:
public class Test {
private static final Random RANDOM = new Random();
private static final int UPPERBOUND = 0b00000001_00000000_00000000_00000000;
public static void main(String[] args) {
float f = 0;
while((f = randomFloat()) != 1) {
System.out.println(f);
}
System.out.println(f);
}
public static float randomFloat() {
int random = RANDOM.nextInt(UPPERBOUND + 1);
return random / ((float) (1 << 24));
}
}
Dieser Code spuckt auf jeden Fall IRGENDWANN mal 1.0 aus weil 0b00000001_00000000_00000000_00000000 * 2 ^ -24 = 1.0 ist.