Zufallswürfel

Need_Help1993

Bekanntes Mitglied
ein "Problemchen" habe ich da aber noch.
ich soll einen Zufallswürfel (Buchsaben von A - Z) implementieren, und bin mir mit der Wertemenge nicht so ganz sicher (beim Testen komme ich nie auf A)

Java:
public class Wuerfel {		
	public static char wuerfele (char max, char min) {

		return(char)(min+(char)(Math.random()*(max-min)));
	}
}

Java:
 import java.util.Scanner;
import java.io.PrintStream;

public class Test {
	
	public static void main(String[] args) {
				
		Scanner eingabe = new Scanner (System.in);
		PrintStream aus = System.out;
		aus.println("Minimalwert hier eingeben (A  bis Z), anschließend enter drücken");
		char min = eingabe.nextLine().charAt(0);
		aus.println("Maximalwert hier eingeben (A bis Z), anschließend enter drücken");
		char max = eingabe.nextLine().charAt(0);
		aus.println("Sie haben die folgende Zahl gewürfelt");		
		aus.println(Wuerfel.wuerfele(min, max));
	}
}
 
S

SlaterB

Gast
gib max-min mit System.out.println aus

generell: nicht mit Eingaben testen, zunächst alles in Quellcode schreiben, gleich mal eine Schleife 100 Tests machen lassen
 
S

SlaterB

Gast
aus.println(Wuerfel.wuerfele(min, max));
ist doch schon eine Zeile deines Code, wieso sollte die jetzt einen Fehler werfen,

außerdem hat diese Zeile nichts mit der Ausgabe von max-min zu tun,
vielleicht hast du sie bei dir verändert, dann hast du das nicht gepostet

nochmal:
- als erstes lernt man in Java Dinge auszugeben, denke zurück an Hello World-Programme (Ausgabe von Hello World)
- wie auch immer du es anstellen möchtest, gib die Differenz von max und min aus, schau dir das Ergebnis dieser entscheidenden Rechnung für deinen Zufallsbereich an!

------

eine Schleife ist eine Schleife, das steht in Lehrbüchern,
mit einer Schleife kann man Dinge wiederholen, z.B. mehrere Zufälle ausgeben, statt jedes Mal das Programm neu zu starten,
von mir nur der konzeptionelle Tipp, die Idee, wenn dir der Code dazu fehlt, dann eben nicht, auch nicht so wichtig
 

Need_Help1993

Bekanntes Mitglied
naja, das mit der Testschleife ist erstmal zweitrangig... mein problem ist nur, dass der "Zufallsgenaerator" nie auf den Minimalwert kommt, und ich weiß nicht warum..
z.B. bei Min B, Max C würfelt er 100 mal C und nie B...
 
S

SlaterB

Gast
ich sehe gerade dass ich auf etwas falsches abzielte, dachte es läge daran dass die chars als Zahlen ja hohe Werte sind 55, 60 usw., statt 0-26,
aber das macht in der Differenz ja nichts,

dennoch würde dir die Differenz weiterhelfen (Glück für mich ;) ),
schade dass du dich so dramatisch gegen diese Informationsbeschaffung weigerst,
da danach noch weiter zu überlegen ist verrate ich dir diesen Schritt:

bei
Java:
public class Test
{

    public static void main(String[] args)
    {
        PrintStream aus = System.out;
        aus.println("Minimalwert hier eingeben (A  bis Z), anschließend enter drücken");
        char min = 'B';
        aus.println("Maximalwert hier eingeben (A bis Z), anschließend enter drücken");
        char max = 'C';
        aus.println("Sie haben die folgende Zahl gewürfelt");
        aus.println(wuerfele(min, max));

    }

    public static char wuerfele(char max, char min)
    {
        System.out.println(max - min);
        return (char)(min + (char)(Math.random() * (max - min)));
    }

}
welch komplizierte Erweiterung, kommt -1 für die Differenz raus, hilft dir dieser Hinweis?
es bleibt bisher noch ein kleines Rätsel, ich will es bewußt nicht unbedingt gleich verraten,
selber drauf zu kommen/ weitere Informationen mit puren Fleiß zu erarbeiten würde dir allgemein helfen
 

Asgar13

Bekanntes Mitglied
:lol: Habe es auch endlich gefunden.

Java:
public class Test
{
 
    public static void main(String[] args)
    {
        PrintStream aus = System.out;
        aus.println("Minimalwert hier eingeben (A  bis Z), anschließend enter drücken");
        char min = 'B';
        aus.println("Maximalwert hier eingeben (A bis Z), anschließend enter drücken");
        char max = 'C';
        aus.println("Sie haben die folgende Zahl gewürfelt");
        System.out.println("Maximum: " + max + "Minimum:" +min);
        aus.println(wuerfele(min, max));
 
    }
 
    public static char wuerfele(char max, char min)
    {
        System.out.println("Maximum: " + max + "Minimum:" +min);
        System.out.println(max - min);
        return (char)(min + (char)(Math.random() * (max - min)));
    }
}

Das dürfte Klarheit schaffen.
 
S

SlaterB

Gast
@Need_Help1993
-1 erwartest du auch? und Math.random() * -1 liefert dann Zahlen zwischen 0 und -1?

aber Mist, das funktioniert ja tatsächlich im größeren Bereich, du gehst vom höchsten Wert aus und addierst einen negativen Wert bzw. subtrahierst eine Zufallszahl,
ganz schön versteckt, aber zumindest denkbar,

auch meine zweite Idee, nämlich dass du die Parameter vertauschst (Übergabe min ist max in der Methode, achte auf die Reigenfolge!), ist dann letzlich nicht die direkte Fehlerursache..

> Habe es auch endlich gefunden.

nicht komplett ;)



---------

so, dann bleibt noch, nun ohne Rätsel:
Math.random() liefert einen Wert von 0 bis 0,9999999999999,
die Obergrenze kann nie erreicht werden, und selbst wenn dann nur mit minimalen Chancen da immer abgerundet wird,

du musst entweder auf die Differenz noch 1 dazuaddieren bzw. abziehen, je nachdem wie versteckt du es bauen willst,
oder (Math.random() * (max - min))) mathematisch korrekt runden,
der Cast auf (char) rundet immer ab, wie gesagt
 

Asgar13

Bekanntes Mitglied
@Need_Help1993
-1 erwartest du auch? und Math.random() * -1 liefert dann Zahlen zwischen 0 und -1?

aber Mist, das funktioniert ja tatsächlich im größeren Bereich, du gehst vom höchsten Wert aus und addierst einen negativen Wert bzw. subtrahierst eine Zufallszahl,
ganz schön versteckt, aber zumindest denkbar,

auch meine zweite Idee, nämlich dass du die Parameter vertauschst (Übergabe min ist max in der Methode, achte auf die Reigenfolge!), ist dann letzlich nicht die direkte Fehlerursache..

> Habe es auch endlich gefunden.

nicht komplett ;)



---------

so, dann bleibt noch, nun ohne Rätsel:
Math.random() liefert einen Wert von 0 bis 0,9999999999999,
die Obergrenze kann nie erreicht werden, und selbst wenn dann nur mit minimalen Chancen da immer abgerundet wird,

du musst entweder auf die Differenz noch 1 dazuaddieren bzw. abziehen, je nachdem wie versteckt du es bauen willst,
oder (Math.random() * (max - min))) mathematisch korrekt runden,
der Cast auf (char) rundet immer ab, wie gesagt

:Scheinheilig: Es ging doch nur um die kleinste Zahl, das Wunderliche für mich war, das Math.random() auch 0 hat.

Siehe auch:
Math.random(), Zufallszahlen in Java | ROAE-Blog

Aber wenn man das umdreht, dann kommt keine 0 dabei heraus.

Wieso man so etwas einfaches auch umdrehen sollte? :bahnhof:
 

Need_Help1993

Bekanntes Mitglied
okay. d.h. ich muss hier
Java:
    return(char)(min+(char)(Math.random()*(max-min)));
noch 1 dazu addieren
Java:
    return(char)(min+(char)(Math.random()*(max-min)+1));
und das "programm" funktioniert so wie ich will. Also es würfelt wirklich alle Möglichkeiten (auch A)?
 
S

SlaterB

Gast
es wäre wieder wert, dass du alles im Detail untersuchst, aber da dich anscheinend nicht mal das verdrehte min vs max interessiert:
das -1 gehört in die Klammer von max-min

gruselig
 
Zuletzt bearbeitet von einem Moderator:

Need_Help1993

Bekanntes Mitglied
okay... das wars.
doch doch interessieren tut mich das verdrehte min, max schon... ich verstehe nur nicht so richtig was du damit meinst?

wieso soll ich meinen halben code umbauen, wenn ich einfach noch ein -1 einbauen kann und alles so läuft wie es soll?
 

Asgar13

Bekanntes Mitglied
okay... das wars.
doch doch interessieren tut mich das verdrehte min, max schon... ich verstehe nur nicht so richtig was du damit meinst?

wieso soll ich meinen halben code umbauen, wenn ich einfach noch ein -1 einbauen kann und alles so läuft wie es soll?

Damit du später noch weißt, was du da gemacht hast, mit der verdrehten Logik, brauchst du länger um drauf zu kommen.
 
S

SlaterB

Gast
mir fällt grad nix besseres ein aber hier ein Beispiel welches ähnlich vertauscht und alles kreuz und rückwärts in Einbahnstraße rechnet
Java:
public class Test
{

    public static void main(String[] args)
    {
        int a = 7;
        int b = 4;
        System.out.println(subtract(a, b));
    }

    public static int subtract(int b, int a)
    {
        return -1 * (a - b);
    }
}
wieso läßt du nicht a a sein und b b sein bzw. min min und max max,
wieso (versteckt irreführend) vertauschen und dann als Folge z.B. -1 statt +1 rechnen
 

Need_Help1993

Bekanntes Mitglied
okay, dass verstehe ich wiederrum ;)
also was müsste ich an meinem code verändern, um mir dieses verwirrende hin und hergerechne zu ersparen?
Java:
 public class Wuerfel {		
	/**
	 * Die Methode legt einen zufälligen Char Wert fest
	 * @param min : legt den niedrigsten erlaubten Wert fest
	 * @param max : legt den höchsten erlaubten Wert fest
	 * @return gibt den zufällig erzeugten (gewürfelten) Wert als char zurück
	 */
	
	 public static char wuerfele (char max, char min) {
		 
	        return(char)(min+(char)(Math.random()*(max-min-1)));
   }


 import java.util.Scanner;
import java.io.PrintStream;
 
public class Test {
    
    public static void main(String[] args) {
                
        Scanner eingabe = new Scanner (System.in);
        PrintStream aus = System.out;
        aus.println("Minimalwert hier eingeben (A  bis Z), anschließend enter drücken");
        char min = eingabe.nextLine().charAt(0);
        aus.println("Maximalwert hier eingeben (A bis Z), anschließend enter drücken");
        char max = eingabe.nextLine().charAt(0);
        aus.println("Sie haben die folgende Zahl gewürfelt");       
        aus.println(Wuerfel.wuerfele(min, max));
    }
}
	}
 
S

SlaterB

Gast
> public static char wuerfele (char max, char min)
auf
> public static char wuerfele (char min, char max)
zu ändern, was zum Aufruf sowie zur dokumentierten Parameter-Reihenfolge passt,
ist kein Gedanke der dir links vom Monitor erscheint?

den Rest an diese neue bessere Ausgangssituation angleichen, auch keine eigenen Ideen?

edit: Asgar13 postet die andere Variante
 

Asgar13

Bekanntes Mitglied
Java:
aus.println(Wuerfel.wuerfele(max, min));

und aus der -1 eine +1 machen, das sollte genügen. (ungetestet)
 

Oben