Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.08.2011, 09:42

Zufallsgenerator testen und Prozentanteil berechnen

Hey Leute.

Ich gebe Nachhilfe in Programmieren (C#) und da hat mir mein Freund ein paar Word-Dokumente gegeben, bin Beispielen die er für die Prüfung braucht.

Alles zum Großteil Testbeispiele die ich im Schlaf lösen kann.

Jetzt hänge ich aber an etwas sehr simplen...

Zitat


Für ein Würfelspiel, bei dem der Computer auch würfeln muss, wird ein Zufallsgenerator gebraucht. Dieser soll vorher auf seine Güte überprüft werden. Dies geschieht dadurch, dass dieser sehr oft (z.b. 10000 mal) eine Zufallszahl in einem bestimmten Bereich (z.B. 1 – 6) generiert und mitgezählt wird, wie oft jede Zahl auftritt. Die Anzahl, wie oft jede Zahl auftritt, und deren Prozentanteil sind am Ende auszugeben.


Eigentlich nichts schweres, oder?

Okay, meine Lösung:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
        static void Main(string[] args)
        {
            Random rnd = new Random();
            int[] zahlen = new int[6];
            int help = 0;

            zahlen[0] = 0;
            zahlen[1] = 0;
            zahlen[2] = 0;
            zahlen[3] = 0;
            zahlen[4] = 0;
            zahlen[5] = 0;

            for (int i = 1; i <= 10000; i++)
            {
                help = rnd.Next(1, 7);
                switch (help)
                {
                    case 1: zahlen[0]++;
                        break;
                    case 2: zahlen[1]++;
                        break;
                    case 3: zahlen[2]++;
                        break;
                    case 4: zahlen[3]++;
                        break;
                    case 5: zahlen[4]++;
                        break;
                    case 6: zahlen[5]++;
                        break;
                }
            }

            float prozent = zahlen[0]/(10000/100);
            Console.WriteLine("Die 1 kommt " + zahlen[0] + " mal vor. (" + prozent + "%)");
            prozent = zahlen[1] / (10000 / 100);
            Console.WriteLine("Die 2 kommt " + zahlen[1] + " mal vor. (" + prozent + "%)");
            prozent = zahlen[2] / (10000 / 100);
            Console.WriteLine("Die 3 kommt " + zahlen[2] + " mal vor. (" + prozent + "%)");
            prozent = zahlen[3] / (10000 / 100);
            Console.WriteLine("Die 4 kommt " + zahlen[3] + " mal vor. (" + prozent + "%)");
            prozent = zahlen[4] / (10000 / 100);
            Console.WriteLine("Die 5 kommt " + zahlen[4] + " mal vor. (" + prozent + "%)");
            prozent = zahlen[5] / (10000 / 100);
            Console.WriteLine("Die 6 kommt " + zahlen[5] + " mal vor. (" + prozent + "%)");

            Console.ReadLine();
        }


Mein Problem ist jetzt nur die Prozentberechnung. Er sagt mir bei jedem immer "16%". Ich hasse Prozentberechnungen und ich habe Ferien >.> Da spielt mein Hirn nicht mit...

PS.: Der Code ist für Leute geschrieben, die nicht gut sind in Programmieren. Er enthällt noch Kommentare, die ich euch aber erspart habe.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

29.08.2011, 09:56

Hi.

Also ich gebe da jetzt scheinbar mal dem Nachhilfelehrer etwas Nachhilfe.

1) Dein Array mit Integern wird automatisch auf Nullen initialisiert.

2) Du brauchst kein switch. Wofür auch?
Das kannst Du prima so lösen:

C#-Quelltext

1
2
 for (int i = 1; i <= 10000; i++)
    zahlen[rnd.Next(6)]++;


3) 10000/100? Warum nicht gleich 100?

4) Dividiert man einen Integer durch einen Integer (zahlen[x]/100), dann fliegen da Nachkommastellen weg. Daher muss 16% rauskommen (sofern Random nicht totaler Müll ist)

5) Wenn Du einen float erhalten willst, dann musst Du auch mit float arbeiten: 100.f

6) Es gibt Schleifen. Nutze sie.

Damit sieht eine verbesserte Lösung aus wie folgt:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main(string[] args)
{
    Random rnd = new Random();
    int[] zahlen = new int[6];

    for (int i = 0; i < 10000; i++)
        zahlen[rnd.Next(zahlen.Length)]++;

    for ( int i = 0; i < zahlen.Length; i++ )
        Console.WriteLine("Die " + (i + 1) + " kommt " + zahlen[i] + " mal vor. (" + (zahlen[i] / 100.f) + "%)");

    Console.ReadLine();
}
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

29.08.2011, 10:03

Danke für deine Antwort:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main(string[] args)
        {
            Random rnd = new Random();
            int[] zahlen = new int[6];

            for (int i = 1; i <= 10000; i++)
                  zahlen[rnd.Next(6)]++;

            for ( int i=0; i<zahlen.Length; i++ )
                  Console.WriteLine("Die " + (i + 1) + " kommt " + zahlen[i] + " mal vor. (" + (zahlen[i] / 100.f) + "%)");

            Console.ReadLine();
        }


Erklär das bitte jemanden, der schon Probleme hat, den Unterschied zwischen Console.Write(); und Console.WriteLine(); zu erklären. Ich habe es absichtlich so "einfach" geschrieben.

Zitat


4) Dividiert man einen Integer durch einen Integer (zahlen[x]/100), dann fliegen da Nachkommastellen weg. Daher muss 16% rauskommen (sofern Random nicht totaler Müll ist)

5) Wenn Du einen float erhalten willst, dann musst Du auch mit float arbeiten: 100.f


An das f habe ich garnicht gedacht... Ach ja, auf die einfachsten Dinge kommt es an. BTW.: 100f statt 100.f aber das ist ja nur ein Flüchigkeits fehler (:

Zitat

6) Es gibt Schleifen. Nutze sie.


Wie gesagt, es sollte so EINFACH wie möglich sein. Und jetzt nicht einfach für einen Fortgeschrittenen sondern für einen Anfänger. Für einen BLUTIGEN Anfänger.

Danke.

PS.: Kann ich den Thread garnicht auf gelöst setzen?


tztztz blödes f

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

29.08.2011, 10:04

Wenn wir schon bei gutem Code sind schadet ein string.Format nicht:

C#-Quelltext

1
Console.WriteLine(string.Format("Die {0} kommt {1} mal vor. ({2}%)", i + 1, zahlen[i], zahlen[i] / 100.f));

5

29.08.2011, 10:05

Wie gesagt, das wäre für einen Anfänger reines Chinesisch.

Und es gehört kein PUNKT nach der 100. Also es gehört so: 100f

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

6

29.08.2011, 10:05

so schnell werden aus 48 codezeilen 10 ^^
Wirago gefällt das.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

29.08.2011, 10:06

naja also ich denke wenn ein blutiger anfänger solch einen algorithmus implementieren soll, ist string.Format 1. wesentlich übersichtlicher und sehr einfach zu verstehen. das sind platzhalter, die durch die nachfolgenden Parameter ersetzt werden :rolleyes:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

29.08.2011, 10:38

Und es gehört kein PUNKT nach der 100. Also es gehört so: 100f

Ja, da ist entweder ein Punkt zu viel oder eine Null zu wenig ... 100.0f ... mein Gott ... Und ich dachte immer sowas kompiliert!? Welche Sprache war das, wo das geht? Oder sitz ich grad verquer?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

29.08.2011, 10:59

Geht in C++ nur mit 100.f. In D geht beides (also 100.f und 100f) und in Python funktioniert gar nichts davon.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

29.08.2011, 11:18

War mir doch so. Jut :)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige