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

R3D L10N

Treue Seele

  • »R3D L10N« ist der Autor dieses Themas

Beiträge: 106

Beruf: Schüler

  • Private Nachricht senden

1

13.05.2010, 15:07

Zufallszahl generieren?

Hallo!

Ich möchte für die Schule ein Programm schreiben, dass einen Würfel Simuliert.
Ich kenne den Grundbefehl zum generieren einer Zufallszahl:

C-/C++-Quelltext

1
int zufall = rand() % 6

Aber dieser Befehl gibt mir eine Zahl zwischen 0 und 6 aus.
Um einen Würfel zu simulieren, brauche ich logischerweise eine Zahl von 1 - 6.
Gibt es da eine Möglichkeit, den Befehl evtl. auch ohne Modulo auszuführen?

Nach möglichkeit sollte das Programm nachher die Anzahlen der 1, 2, 3, 4, 5 und 6 anzeigen.
Ungefähr so:

1
4
5
4
6
2
5
5
Anzahl 1: 1
Anzahl 2: 1
Anzahl 3: 0
Anzahl 4: 2
Anzahl 5: 3
Anzahl 6: 1

Wie schaffe ich so etwas?
Ich hätte hier einen Ansatz:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
go:
int zaehler1 = 0;
int zufall = rand() % 6;
cout << zufall;
if (zufall == 1) {
   zaehler1 = zaehler1 + 1;
}
...
Sleep(2000);
cout << "Anzahl 1: ";
cout << zaehler1;
cout << "\n";
Sleep(2000);
...
goto go;


Wenn ich das aber so anwende, wird mir die Variable zaehler1 manchmal als 25, dann als 47 usw. angezeigt...
Ist klar, dass da ein Fehler bzw. eingige viele drin sind, ich wüsste nur gerne welche???
MfG R3DL10N

2

13.05.2010, 15:23

Aber dieser Befehl gibt mir eine Zahl zwischen 0 und 6 aus.
Um einen Würfel zu simulieren, brauche ich logischerweise eine Zahl von 1 - 6.
Gibt es da eine Möglichkeit, den Befehl evtl. auch ohne Modulo auszuführen?
Gibt viele Möglichkeiten. Das einfachste ist zahl=rand()%6+1;
Wenn ich das aber so anwende, wird mir die Variable zaehler1 manchmal als 25, dann als 47 usw. angezeigt...
Ist klar, dass da ein Fehler bzw. eingige viele drin sind, ich wüsste nur gerne welche???
Nimm bloß das goto da raus.
Ansonsten siehts ganz gut aus. Kommt das was du als Fehler siehst vielleicht daher, dass du manchmal 25 und manchmal 47 Zufallszahlen hast?

3

13.05.2010, 15:28

Les das mal, das erklärt eigentlich alles, was du wissen musst:
Zufälle gibts
Lieber dumm fragen, als dumm bleiben!

R3D L10N

Treue Seele

  • »R3D L10N« ist der Autor dieses Themas

Beiträge: 106

Beruf: Schüler

  • Private Nachricht senden

4

13.05.2010, 15:34

Nimm bloß das goto da raus.

Wenn ich das mache, kann ich aber nicht mehr ganz viele Zahlen generieren lassen.
Es sei denn, es gibt noch eine andere Möglichkeit, einen Befehl immer wieder auszuführen.
MfG R3DL10N

Dark Fly

Treue Seele

Beiträge: 163

Wohnort: Bielefeld

Beruf: Schüler

  • Private Nachricht senden

5

13.05.2010, 15:37

@ R3D L10N: Scheint mir fasst, als hättest du die rand() funktion gar nicht verstanden bzw. was das Modulo"%" macht...?
MfG Dark Fly

C-/C++-Quelltext

1
2
3
4
int *i;                     // Erstelle Zeiger
while(true)                 // führe Schleife immer aus
{new (int) = i;}            // allokiere frischen Speicher
                            // warte auf unendliche Langsamkeit....

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

6

13.05.2010, 15:40

Versuchs mal mit for oder while:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// Die 3 anweisungen sind folgende:
// 1. Erst eine Variable initialisieren
// 2. Dann die bedingung wie lange der auf das for-statment folgende Block ausgeführt werden soll ( solange dieser teil true ergibt wird wiederholt)
// 3. Zum incrementieren der zählers (kann aber auch irgendwas anderes enhalten ;) )

// i soll von 0 bis 4 hochgezählt werden (also der block soll 5 mal ausgeführt werden)
for( int i = 0; i < 5; ++i)
{
  // Das wird 5 mal ausgeführt
  cout << "Hallo zum " << i << ". mal :)" << endl;
}



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
// die while schleife is im prinzip nur der mitlere teil der for-schleife

int i = 0;
while(i < 5)
{
  
cout << "Hallo zum " << i << ". mal :)" << endl;
  ++i;
}

7

13.05.2010, 15:41

while und for schleifen
http://www.cprogramming.com/tutorial/lesson3_tg.html

goto ist böse.

R3D L10N

Treue Seele

  • »R3D L10N« ist der Autor dieses Themas

Beiträge: 106

Beruf: Schüler

  • Private Nachricht senden

8

13.05.2010, 16:03

Scheint mir fasst, als hättest du die rand() funktion gar nicht verstanden bzw. was das Modulo"%" macht...?

Die rand() funktion habe ich irgendwo aufgeschnappt und der Modulo Operator errechnet den Rest einer Division(15 % 3 = 0 \ 17 % 3 = 2)
MfG R3DL10N

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »R3D L10N« (13.05.2010, 16:08)


Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

9

13.05.2010, 18:26

rand ist eine der einfachsten und simpelsten Methoden um schnell eine Zufallszahl zu bestimmen. Jedoch ist die Periode sehr kurz(d.h. die Zufallsverteilung relativ schlecht). Bessere Zufallszahlen können mit Algorithmn wie dem mersenne-Twister erzeugt werden. Unter

http://de.wikipedia.org/wiki/Mersenne-Twister findet sich auch gleich eine Beispielorientierung. Wenn die Zufallszahlen später mal für andere Zwecke wie Verschlüsselung oder Ähnliches verwendet werden sollen, bietet es sich an gleich von Anfang solche Funktionen zu verwenden. Und was einmal programmiert wurde, kann man ja weiter verwenden.(in dem fall ;))

10

14.05.2010, 12:16

mhm also eine zufallszahl zu programmieren ist ersteinmal verdammt schwer und ein eigener bereich in der programmierung...... wenn du einfach nur die srand() funktion benutzt hast du zwar 'zufallszahlen' aber wenn du das programm erneut aufrufst kommt immer die gleiche zahl...... um das zu vermeiden kannst du die cTime include einbinden und dann auch mit der t_time variable arbeiten..... diese bezieht die zufallszahlen immer auf die aktuelle zeit....

angaben ohne gewähr (besonder bei t_time bin ich mir nicht mehr sicher ob es so hieß)

Werbeanzeige