Möglichkeit einer genaueren Ausgabe?

ArrorRT

Lieutenant
Registriert
Jan. 2021
Beiträge
868
Servus,

ich habe vor 2 Tagen schon ein mal ein Thema zu meinem Programm eröffnet, das nun auch läuft, aaaber es gefällt mir noch nicht so ganz.
Ich habe ein Spiel programmiert, in dem man eine Zufallszahl erraten muss und ich habe die Aussage das die Zahl entweder zu groß oder zu klein ist.
Nun möchte ich aber genauere Aussagen einbauen und die vorhandenen behalten. Also z. B., das Spektrum geht von -2147483647 bis 2147483647 und die Zufallszahl ist 0 dann kann bei 2147483647 stehen, dass die Zahl kleiner ist, aber wenn man z. B. 100 eintippt soll stehen das man nah dran ist aber die Zahl kleiner ist.

(Das Datum nicht beachten, das ist nur just for fun xD)
1645693110036.png


C#:
using System;
using System.Windows.Forms;

namespace Testproject
{
    public partial class Form1 : Form
    {
        int obergrenze;
        int untergrenze;
        int zufallszahl = 0;
        int counter = 0;
        Random r = new Random();
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void button1_Click(object sender, EventArgs e)
        {
            lblversuche.Text = "";
            textBoxEingabe.Text = "";
            textBoxZähler.Text = "";

            if (int.TryParse(textBox3.Text, out untergrenze))
            {
                if (int.TryParse(textBox4.Text, out obergrenze))
                {
                    if (untergrenze < obergrenze)
                    {
                        zufallszahl = r.Next(untergrenze, obergrenze + 1);
                        textBoxAnzeige.Text = "Das spiel läuft";
                    }
                    else
                    {
                        textBoxAnzeige.Text = "Die Untergrenze muss kleiner als die Obergrenze sein";
                    }
                }
                else
                {
                    textBoxAnzeige.Text = "Die Obergrenze muss eine gültige Zahl sein (1 - 10)";
                }
            }
            else
            {
                textBoxAnzeige.Text = "Die Obergrenze muss eine gültige Zahl sein (1 - 10)";
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            int eingabe = 0;
            counter += 1;
            string Trennzeichen = " ";

            lblversuche.Text = counter.ToString();
            if (int.TryParse(textBoxEingabe.Text, out eingabe))

            {
                if (zufallszahl > eingabe)
                {
                    textBoxAnzeige.Text = "Die Zufallszahl ist größer als die Eingabe";
                }

                else if (zufallszahl < eingabe)
                {
                    textBoxAnzeige.Text = "Die Zufallszahl ist kleiner als die Eingabe";
                }
                else
                {
                    textBoxAnzeige.Text = "Sie haben zwar gewonnen aber werden keinen Preis bekommen";
                }
                textBoxZähler.Text += Trennzeichen + eingabe.ToString();
            }
            else
            {
                textBoxAnzeige.Text = "Die Obergrenze muss eine gültige Zahl sein (1 - 10)";
            }

        }
        private void textBox4_TextChanged(object sender, EventArgs e)
        {

        }

        private void lblversuche_Click(object sender, EventArgs e)
        {

        }

        private void textBox5_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
 
Das Problem ist, dass "nah" relativ ist. Ich schlage vor, mal kurz die Finger von den Tasten zu nehmen und zunächst einmal "mathematisch" zu übelegen, nach welchem Kriterium man im beschriebenen Fall von "nah" oder "fern" sprechen kann.
 
Das wäre aber sehr absolut. Das heißt, wenn ich 1000 eingebe, bin ich genauso nah dran an der 1, als wenn ich bei 3000 eine 2000 eingebe oder um bei deiner Zahl 2.147.483.647 zu bleiben:

1000 wäre so nah dran an der 1 wie 2.147.482.647 an 2.147.483.647 dran ist. Ich würde da eher mit Prozenten rechnen. Im Idealfall vielleicht sogar eine Kombination. Sprich bis Zahlenbereich x gebe ich einen absoluten Wert vor, ab Zahlenbereich y werden dann % von der gesuchten Zahl genommen.
 
@kachiri ich wusste nicht das, das geht, aber da hast du natürlich recht, in % zu rechnen wäre natürlich besser.
 
ArrorRT schrieb:
in % zu rechnen wäre natürlich besser.

Schade, ich hatte gehofft, Du würdest da selbst drauf kommen. Bin ja mal auf Deine Implementierung gespannt.
 
  • Gefällt mir
Reaktionen: Aduasen
@BAGZZlash
Also muss der Befehl (wörtlich gesprochen) ja lauten: wenn die eingegebene Zahl 10 % von der Zufallszahl entfernt liegt, dann gib aus "Sie sind nah dran, aber die Zahl ist größer/kleiner" richtig?
 
  • Gefällt mir
Reaktionen: BAGZZlash und Jesterfox
kachiri schrieb:
1000 wäre so nah dran an der 1 wie 2.147.482.647 an 2.147.483.647 dran ist. Ich würde da eher mit Prozenten rechnen.
Bei einem Ratespiel mit festem Wertebereich würde ich das aber absolut machen, denn ansonsten wäre ja der Hinweisbereich davon abhängig welche Zufallszahl man raten muss, was ich eher ungünstig finde. Im Extremfall hat man den Hinweis das man nahe ist entweder wenn noch tausende von Zahlen in Frage kommen oder gar nicht (bei der 1 wäre ja schon die 2 zu 100% daneben...)


PS @ArrorRT : unabhängig davon wie man die Grenzwerte jetzt festlegt liegst du mit deiner Beschreibung schon sehr gut.
 
  • Gefällt mir
Reaktionen: Incanus und BeBur
Deswegen ja die Kombination aus beiden: Zahlenbereich bis x absolut. Ggfs. sogar gestaffelt. Bis 10 maximal eine Abweichung von 1, bis 20 eine Abweichung von 2, ... und dann ab einer gewissen Größe berechne ich die Abweichung anhand einer Prozentangabe oder aber ich bleibe absolut und erhöhe immer weiter die erlaubte Abweichung.
Ich finde 100 bei einer gesuchten Zahl von 1 schon weit daneben. Aber 2.147.483.547 sind bei einer gesuchten Zahl von 2.147.483.647 ziemlich nah dran.

@ArrorRT
Ja, so in etwa. Das kommt aber wirklich nur bei größeren Zahlen in Frage. 10% von einer 1 wären 1,1. Wenn ich also 2 eingebe, wäre ich also nicht nah dran, obwohl ich nur knapp daneben bin ;)
 
@Jesterfox ich habe vor den Bereich noch anpassbar zu machen also nicht zwangsläufig von 1 bis 100 oder sonst was.
Ergänzung ()

@kachiri ich habe nur leider absolut keine Idee wie ich das in Code umsetzen könnte. Habe noch nicht viel Erfahrung 😬
 
kachiri schrieb:
Ich finde 100 bei einer gesuchten Zahl von 1 schon weit daneben. Ich fände aber 2.147.483.547 bei einer gesuchten Zahl von 2.147.483.647 ziemlich nah dran.
ich sehs halt n bissl anders, weil in jedem Fall eine Zahl aus einer Menge von ca. 4 Mrd. gesucht wird... da sollte die Angabe eher Prozentual auf die Gesamtmenge sein, was schlussendlich in einer absoluten Grenze resultiert.
Ergänzung ()

ArrorRT schrieb:
ich habe nur leider absolut keine Idee wie ich das in Code umsetzen könnte
Tipps:

  • Überleg dir wie du die Abweichung der geratenen Zahl gegenüber der gesuchten Zahl ermitteln kannst
  • Schau mal wie du das unabhängig von größer oder kleiner betrachten kannst (Programmiersprachen haben da so tolle mathematische Funktionen)
  • dann hast du fast schon die Lösung
 
  • Gefällt mir
Reaktionen: Onkel Föhn, Incanus und PHuV
Jesterfox schrieb:
da sollte die Angabe eher Prozentual auf die Gesamtmenge sein
Wäre wohl tatsächlich der ideale Mittelweg. Und gleichzeitig den Zahlenbereich noch etwas mehr eingrenzen.

"Nenne mir eine Zahl zwischen -4 Millionen und +4 Millionen..."
Da kann ich nur sehr weit weg sein oder Glück haben. Gerade zu faul, die Wahrscheinlichkeit, die richtige Zahl zu nennen geschweige denn einen "nahen Bereich" zu treffen, zu berechnen.
 
  • Gefällt mir
Reaktionen: ArrorRT
Mit den richtigen Parametern würde ich eine Gaußsche Normalverteilung für sinnvoller halten als prozentuale Abweichungen.

Eine Lösung kann ich damit aber auch nicht aus dem Ärmel schütteln, da muss man schon recht tief in die Mathematik dahinter einsteigen. Mit der klassischen Glockenkurve hätte man aber einen Ansatz, mit dem Werte, die dichter an der Lösung sind, stärker gewichtet werden.
 
ArrorRT schrieb:
okay dann schaue ich mir das mal an. danke

Nee, fang mal lieber leicht an. Wie gesagt, die eigentliche Arbeit beim Programmieren findet abseits der Tastatur statt. Die Implementierung ist nachher meist einfach, wenn man genau weiß, was man implementieren will.

Angenommen, der Bereich, in dem die zu suchende Zahl liegt, geht von -1000 bis 2000. Die gesamte Breite des Raumes ist also 3000. Die zu erratende Zahl sei 500, und der Spieler gibt 1500 ein. Wie groß ist dann die prozentuale Abweichung? 1500 - 500 = 1000, und 1000 / 3000 = 0.3333 = 33%. Ist 33% "nah" oder "nicht nah"? Das musst Du definieren. Eine Meldung "nah dran" könnte man beispielsweise einblenden, wenn die prozentuale Abweichung unter 10% liegt, oder was meinst Du?

Rechne uns doch nochmal zwei, drei weitere Beispiele vor. Wenn das so richtig sitzt, geht's an die Tastatur. Normalverteilung usw. kommt dann erst viel später.
 
  • Gefällt mir
Reaktionen: KitKat::new() und Raijin
BAGZZlash schrieb:
Nee, fang mal lieber leicht an.
Full Ack!

Ich habe Gauß auch nur der Vollständigkeit halber erwähnt. Da ich ja weiß wie es zum aktuellen Stand des Spiels gekommen ist ( :D ), würde der Versuch einer Lösung vor lauter Haare raufen eher früher als später zur vollständigen Glatze führen ;)

Wahrscheinlich ist es besser, wenn man

a) Den Ratebereich nicht auf den vollen I32 Bereich setzt, sondern in einer menschlich begreifbaren Größenordnung bleibt, zB 1000. Denn let's face it: Selbst wenn man es schafft Gauß auf das Ratespiel anzuwenden, wird man dennoch Tage damit verbringen, die gesuchte Lösung aus 4 Milliarden Möglichkeiten herauszuraten. Das sind nämlich echt viele Zahlen.....

b) Im definierten Ratebereich von zB 1000 ganz banal feste Annäherungsbereiche abfragt (zB auf +-100 dran, auf +-20, auf +-5). Diese +- Grenzen kann man ja auch genau so wie die Ober-/Untergrenze des Lösungsbereichs in einer Textbox als Einstellung anbieten.



In erster Linie geht es bei einem Programmiereinsteiger darum, sich mit der "Denkweise" eines Programmierers zu beschäftigen. Eine der wichtigsten Fähigkeiten eines Programmierers ist nämlich die Abstraktion, das Zerlegen eines Problems in seine Einzelteile, um anschließend jedes davon zur Lösungsfindung wieder zusammenzusetzen.

@ArrorRT : Damit meine ich zB dass man alle if-cases vollumfänglich nachvollzogen hat und ohne externe Hilfe die Stelle identifizieren kann, an der man die gewünschte Änderung vornehmen muss. Erinnere dich daran wie du im anderen Thread durch das Programm gestolpert bist und nicht wusstest was du wie wo und warum einfügen musstest :schluck:
 
Ich danke euch für die Hilfe, aber mir ist eine Lösung eingefallen, die doch recht simpel ist xD
 
Zurück
Oben