[C] Zufallszahl

Modder

Stammgast
Hallo zusammen:D

Gleich mal die Aufgabe:

Das gegebene Programm berechnet eine Zufallszahl zwischen 0 bis 32767. Erstellen Sie nun ein Programm, das eine Zufallszahl zwischen 0 und 100 bereitstellt. Der Spieler soll die Zahl erraten. Das Programm zählt die Anzahl Versuche, bis die Zahl gefunden wird.

Hier das gegebene Programm:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int x;
int y;
int z=0;
time_t t;
srand(50000*time(&t));
x=rand();
printf("\n%i",x);
getchar();
}


Was ich bereits herausgefunden habe ist, dass es x=rand()%100; heissen muss, damit die Zufallszahl von 0 bis 100 generiert wird. Ansonsten vermute ich nur, dass das ganze mit einer Zählschleife gelöst werden kann.

Kann mir hier jemand weiterhelfen?

mfg Modder
 

Nebuk

PCtipp-Moderation
Teammitglied
ich hab es so gelöst:

Code:
int main(int argc, char *argv[])
{
  srand (time(NULL));
 
  int zufallz = rand()%30;
  int zaehler = 1;
  int eingabe = 0;
 
  cout << "Erraten Sie eine Zahl von 1 bis 100? (5 Versuche)" << endl;
 
  cout << "Versuch >";
  cin >> eingabe;
  cout << endl;

    for(zaehler; zaehler <= 4; zaehler++)
    {
        if (eingabe > zufallz)
        {
           cout << "Falsch! Die Zahl ist tiefer!" << endl;
           cout << "Versuch >";
           cin >> eingabe;
           cout << endl;
 
        }
        else
        {
           if (eingabe < zufallz)
           {
              cout << "Falsch! Die Zahl ist hoeher!" << endl;
              cout << "Versuch >";
              cin >> eingabe;
              cout << endl;
           }
           else
           {
              if (eingabe == zufallz)
              {
                  cout << "Richtig! Sie haben die Zahl erraten, gratuliere!";
                  cout << endl;
                  cout << endl;
                  system("PAUSE");
                  return 0;
              }
           }
        }
    }
    if (zaehler > 4) 
    {
       cout << "Leider haben Sie die Zahl innert 5 Versuchen nicht erraten." << endl;
       cout << "Versuchen Sie es neu!" << endl;
       cout << endl;
    }
 
  system("PAUSE");
  return 0;
}

so hast du die Möglichkeit die Zufallszahl innert 5 Versuche zu erraten.

Edit. Das ganze kannst du natürlich auch noch mit weiteren Schleifen machen. Zum Beispiel um die Anzahl der zu erratenden Versuche einzustellen und um das Programm nicht direkt zu schliessen etc.
 
Zuletzt bearbeitet:

Masche

Stammgast
--offtopic--
Eine Zufallszahl kann man nicht berechnen ;-)
Richtig, es sollte deshalb korrekt "Pseudozufallszahl" heissen. Solche lassen sich aus der aktuellen Zeit berechnen. Dadurch ist jede so berechnete Zahl anders und nur abhängig gerade aktuellen Zeit, was ja mehr oder weniger zufällig ist.
 

Modder

Stammgast
Danke für eure Antworten:D

Das Programm sollte aber, wenn man z.B. die Zahl 55 eingibt durchlaufen, bis die Zahl 55 erscheint und dann die Anzahl der Versuche, die es benötigte, um auf die Zahl 55 zu kommen zählen.

Ist sowas nicht möglich?

P.S. "Arbeite" mit Microsoft Visual Studio 2008, also C++
 
Zuletzt bearbeitet:

yannis00

Stammgast
Nebuk hat dir ja ein ganzen Quelltext gegeben, der granau macht, was du willst. Was willst du noch mehr?

PS: dein Beispiel ist ihn C und nicht in C++
 

Nebuk

PCtipp-Moderation
Teammitglied
Nein, nicht ganz das. Ich hab einfach den Code gepostet der die Anzahl der Möglichen Versuche eingrenzt.
Anzahl Versuche kannst du aber sicher aufzählen. Du musst einfach nur den zähler weiter Zählen lassen und danach den Wert des Zählers ausgeben lassen.
 

Nebuk

PCtipp-Moderation
Teammitglied
Versuch mal
Code:
#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
  srand (time(NULL));

  int max = 0;
  int zaehler = 1;
  int eingabe = 0;

  cout << "Bitte die Maximalzahl des Zufallwertebereiches eingeben.\n";
  
  cin >> max;
  
  int zufallz = rand()%max;

  cout << "Erraten Sie eine Zahl von 1 bis " << max << " ?\n";

  cout << "Versuch >";
  cin >> eingabe;
  cout << endl;

    for(zaehler; ; zaehler++)
    {
        if (eingabe > zufallz)
        {
           cout << "Falsch! Die Zahl ist tiefer!" << endl;
           cout << "Versuch >";
           cin >> eingabe;
           cout << endl;

        }
        else
        {
           if (eingabe < zufallz)
           {
              cout << "Falsch! Die Zahl ist hoeher!" << endl;
              cout << "Versuch >";
              cin >> eingabe;
              cout << endl;
           }
           else
           {
              if (eingabe == zufallz)
              {
                  cout << "Richtig! Sie haben die Zahl nach " << zaehler << " Versuchen erraten, gratuliere!" << endl;
                  cout << endl;
                  system("PAUSE");
                  return 0;
              }
           }
        }
    }
  system("PAUSE");
  return 0;
}


Weiss nicht ob es zu 100% funktioniert. Hab das nur kurz zusammengebastelt aus dem alten Programm xD
 

Nebuk

PCtipp-Moderation
Teammitglied
Komisch, als ich es einmal durchlaufen liess, klappte es bei mir auch ohne diese Bibliothek...
Aber wenns bei dir nur mit geht, so ist das wohl auch kein Problem. Ist ja schnell eingebunden :-)
 

deluxe

Stammgast
Noch eine kleine Ergänzung zu den Zufallszahlen:
Falls du eine 'echte' Zufallszahl haben willst, lässt du das Programm eine Meldung ausgeben wie:

"Zum Starten bitte eine Taste drücken..."

Dann misst du mit einem Timer die Zeit, bis eine Taste gedrückt wurde und du hast eine physikalische Zufallszahl.
 

Masche

Stammgast
Falls du eine 'echte' Zufallszahl haben willst, lässt du das Programm eine Meldung ausgeben wie:...
Da berechnet, ist auch diese Zahl, mathematisch gesehen, keine echte Zufallszahl. Und da es theoretisch ja möglich wäre, dass Du zweimal genau gleichviel Zeit brauchst, bis zum Drücken der Taste, wäre es auch theoretisch möglich, dass Du zweimal die gleiche Zahl bekommst, was dem Prinzip einer Zufallszahl widerspricht.

Besser ist es deshalb immer noch, die aktuelle Zeit als Basis für die Pseudozufallszahl zu verwenden. Denn dass es zweimal genau die gleiche Zeit/Datum-Kombination gibt, ist logischerweise ausgeschlossen. Deshalb gibt es so auch niemals die gleiche Pseudozufallszahl.
 

slup

PCtipp-Moderation
Teammitglied
...wäre es auch theoretisch möglich, dass Du zweimal die gleiche Zahl bekommst, was dem Prinzip einer Zufallszahl widerspricht....
Versteh ich nicht. Beim Würfeln (physikalische, also echte Zufallszahl) kann ja auch beliebig oft die selbe Zahl hintereinander kommen.
 

M.Ä.N.E

Stammgast
Ja, es heisst ja darum auch "Zufallszahl" das heisst nicht das sie schön verteilt ist es kann ja auch zufällig 5 mal nach einander die selbe Zahl kommen. Nur ist das sehr unwahrscheinlich aber dennoch möglich. Für mich widerspricht das in keiner Art und Weise mit der Definition von Zufallszahl.
 

deluxe

Stammgast
1. Das Ergebniss (also die Zeit, bis eine Taste gedrückt wurde) ist unabhängig vom vorhergehnden.

2. Man kann zwar denn Bereich auf vielleicht 2-4 Sekunden einschränken, doch es ist nicht vorhersagbar, wann sich unser Gehirn entscheidet zu drücken, dazu kommen die Reflexe, wie schnell eine Person drücken kann usw.

3. Meiner Meinung nach ist der Druck auf eine Taste, nach einer (un)gewissen Zeit, durch einen Menschen, ein physikalisches Phänomen.

Alle Zitate sind aus der Wiki Seite.


PS:
Da berechnet, ist auch diese Zahl, mathematisch gesehen, keine echte Zufallszahl.
@Masche: Wie soll man den Überhaupt ohne Rechnen eine Zufallszahl im gewünschten Bereich bekommen? Soviel ich weiss, kann man mit einer "echten" Zufallszahl weiterrechnen, deshalb bleit sie trotzdem eine Zufallszahl.
 
Zuletzt bearbeitet:
Oben