www.mikrocontroller.net

Forum: PC-Programmierung Probleme mit Zufallsgenerator in C


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich habe einen Zufallsgenerator aus dem Netz kopiert und bekommme 
ihne nicht zum laufen. In der Variable "zufall" steht immer nur 2293612 
und nicht eine zufällige Zahl. Könnt ihr mir helfen und mir sagen was 
ich falsch mache und wie man aus dem Programm eine zufallszahl von 0-30 
bekommt?

http://www.c-plusplus.de/forum/viewtopic-var-t-is-39331.html
#include <stdio.h>
#include <stdlib.h>

int i1 = rand();
int i2 = rand();
  
int main(int argc, char *argv[])
{
  // 30 bit-zufallszahl
  int zufall = (i1<<15)+i2;

  printf ("%i",&zufall);
  system("PAUSE");  
  return 0;
}

int zufall(const int a, const int b)
{
  // zielbereich
  int c = b-a;
  
  // c muß größer als 0 sein
  // c muß kleiner als RAND_MAX sein
  // obergrenze, über der rand verworfen wird

  int d = RAND_MAX - (RAND_MAX % c);
  int e;
  do
  {
    e = rand();
  }while (e < d);
  return (e % c) + a;

}


Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
srand()

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo steht das und was meinst du damit?

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du rufst auch nicht zufall auf, sondern printest die Addresse der 
Variable
Zufall, welche dir vielleicht auch die Prozedur Zufall hidded.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was muss ich den in print einfügen?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nichts einfügen, was weglassen...

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber was?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So viele Möglichkeiten gibts da nicht.

Lies mal in deinem C-Handbuch nach, was der Adress-Operator ist und was 
der macht.

Und schmeiß vielleicht die Funktion Zufall einfach weg - die ist nämlich 
völlig unnütz und schafft höchstens Konfusion...

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mir nicht einfach sagen was ich machen muss?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst doch was lernen, oder?

Beitrag "Re: Probleme mit Zufallsgenerator in C"

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und was soll ich mit dem Beitrag nochmal anfangen?

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir nicht eifach einer sagen was ich machen muss damit ich ein 
Zufallszahl von 0-30 aufgeben kann.

Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Anfänger hast du schon eine Lösung für das ganze. Ich könnte das 
auch für mein Programm gebrauchen.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
lass das "&" vor "zufall" in der printf anweisung weg und es wird der 
wert und nicht die adresse ausgegeben.

!du hast eine variable und eine funktion mit dem gleichen namen. als 
ungeuebter kann man dabei den ueberblick verlieren.

versuchs mal mit 'nem tuturial, damit die grundlagen richtig sitzen; 
sonst noch viel spass.

qq

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein ich komme einfach nicht weiter, ich habe mir durchgelesen was der 
Adress-Operator macht und habe die Funktion Zufall weg gelassen aber 
komme einfach nicht weiter.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Gast, dass nenne ich mal eine Antwort an der ich lernen kann. Aber 
nicht für ungut Uhu Uhuhu wenn du das für dich brauchst über anderen 
zustehen dann tu das.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>lass das "&" vor "zufall" in der printf anweisung weg und es wird der
>wert und nicht die adresse ausgegeben.
Habe ich gemacht aber ich bekomme immer 1361955 ausgegeben.
{
int i1 = rand();
int i2 = rand();
  // 30 bit-zufallszahl
  int zufall = (i1<<15)+i2;
  
  printf ("%i\n\n\n",zufall);
  printf ("%i\n\n\n",zufall);
  printf ("%i\n\n\n",zufall);
  printf ("%i\n\n\n",zufall);
  
  system("PAUSE");  
  return 0;
}


int zufall(const int a, const int b)
{
  // zielbereich
  int c = b-a;
  
  // c muß größer als 0 sein
  // c muß kleiner als RAND_MAX sein
  // obergrenze, über der rand verworfen wird

  int d = RAND_MAX - (RAND_MAX % c);
  int e;
  do
  {
    e = rand();
  }while (e < d);
  return (e % c) + a;

}



Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Zufallsfunktion war doch schon fast richtig. Nur mit dem Aufruf
hat's gehapert. Hier ist eine funktionierende Version. Die wesentlichen
Änderungen habe ich mit einem <========= markiert:
#include <stdio.h>
#include <stdlib.h>

int zufall(const int a, const int b)
{
  // generiert eine Zufallszahl im Bereich a <= x <= b
  // zielbereich
  int c = b - a + 1;                       // <=========
  
  // c muß größer als 0 sein
  // c muß kleiner als RAND_MAX sein
  // obergrenze, über der rand verworfen wird

  int d = RAND_MAX - (RAND_MAX % c);
  int e;
  do
    e = rand();
  while (e >= d);                          // <=========
  return (e % c) + a;

}

int main(int argc, char *argv[])
{
  int i;

  // Ausgeben von 10 Zufallszahlen im Bereich 5 <= x <= 67
  for(i=0; i<10; i++)
    printf ("%i\n", zufall(5, 67));        // <=========
  return 0;
}

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die Zählschleife durch die print's ersetzt aber ich bekomme 
immer die gleiche zahlen folge.Also wenn ich das Programm starte dann 
steht da
10
22
10
26
11
7
8

und wenn ich das programm noch eimal starte dann steht da wieder
10 22 10 .... das ist do keine zufall.

int main(int argc, char *argv[])
{
  int i;

  // Ausgeben von 10 Zufallszahlen im Bereich 0 <= x <= 30

    printf ("%i\n", zufall(0, 30));        // <=========
    printf ("%i\n", zufall(0, 30));
    printf ("%i\n", zufall(0, 30));
    printf ("%i\n", zufall(0, 30));
    printf ("%i\n", zufall(0, 30));
    printf ("%i\n", zufall(0, 30));
    printf ("%i\n", zufall(0, 30));

    system("PAUSE");
  return 0;
}

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@anfaenger
du gibts 4mal hintereinander mit printf die gleiche zahl aus. warum 
sollte sie sich aendern und andere werte annehmen? zwischen den ausgaben 
muss die zahl neu berechnet werden.
(mach mal ein "++" vor jeden "zufall" innerhalb der printf: ++zufall, 
dann ändern sich die Zahlen)

wenn man etwas 4mal macht, nutzt man eine schleife, ...

nichts fuer ungut, aber starte mit einem tuturial oder gutem buch zum 
selber lernen. du hast dann viel mehr erfolg und spass. in einem forum 
wird das m. me. nichts.

kopf hoch
qq

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt meckert mein Kompieler und ich kann das Programm nicht testen.



for(i=0; i<10; i++)
    printf ("%i\n", ++zufall(0, 31));        // <=========
    system("PAUSE");

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, schau mal auf die zeiten des postings. das "++" bezog sich auf 
dein beispiel weiter oben. bei der letzten variante mit der funktion 
passt das natuerlich nicht.
vergiss meinen teil einfach.

gute nacht
qq

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> und wenn ich das programm noch eimal starte dann steht da wieder 10 22
> 10 .... das ist do keine zufall.

Das ist der Punkt, wo Sven ins Spiel kommt, der schrieb:

> srand()

Mit
  srand(n);

wird der interne Startwert des Zufallszahlengenerators festgelegt. Ohne
srand-Aufruf ist der Startwert immer 1. Um bei jedem Programmaufruf
einen anderen Startwert zu erhalten, muss das an srand() übergebene
Argument veränderlich sein. Man kann bspw. die aktuelle Uhrzeit per
time() übergeben:
#include <time.h>
...
int main(int argc, char *argv[])
{
  int i;

  srand(time(NULL));
...

Es gibt bessere Funktionen zur Generierung des Startwerts als time(), da
sich die gelieferte Uhrzeit nur einmal pro Sekunde ändert. Allerdings
sind diese Funktionen meist betriebssystemspezifisch.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich das so mache dann bekomme ich eine Zahlen reihen von
1361956
1361957
1361958
1361959
1361960
1361961
1361962
usw.

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{

int i1 = rand();
int i2 = rand();
int i;
  // 30 bit-zufallszahl
  int zufall = (i1<<15)+i2;
  for(i=0; i<10; i++)
  printf ("%i\n\n\n",++zufall);


  system("PAUSE");
  return 0;
}


int zufall(const int a, const int b)
{
  // zielbereich
  int c = b-a;

  // c muß größer als 0 sein
  // c muß kleiner als RAND_MAX sein
  // obergrenze, über der rand verworfen wird

  int d = RAND_MAX - (RAND_MAX % c);
  int e;
  do
  {
    e = rand();
  }while (e < d);
  return (e % c) + a;

}

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst dich entscheiden, ob du die Variable zufall
int zufall = (i1<<15)+i2;

oder den Wert der Funktion zufall
int zufall(const int a, const int b)

ausgeben möchtest.

Das ++ vor der Variablen zufall bringt nicht viel, da zwar der Wert
von zufall verändert aber keine neue Zufallszahl generiert wird.

Ansonsten schließe ich mich "Gast" an, der schrieb:

> nichts fuer ungut, aber starte mit einem tuturial oder gutem buch zum
> selber lernen. du hast dann viel mehr erfolg und spass. in einem forum
> wird das m. me. nichts.

Z.B. der Klassiker

  Kernighan & Ritchie, Programmieren in C

Da steht alles drin, was du für dein aktuelle Problem wissen musst, und
alles andere auch.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry anfaenger, hier gab es zeitliche ueberschneidungen.
mach mit deiner variante von 21:45 weiter und nutze die info von yalu um 
22:07. dann hast du es geschafft.

good luck
gg

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also jetzt bin ich total durch einender und komme nicht mehr weiter.
Könnte mit nicht einer mal den Quelltext schreiben, so das wenn ich 
zufall aufrufe immer eine andere Zahl erscheint und wenn ich das 
Programm noch einmal öffne das denn die reihenfolge der Zahlen anders 
ist als beim ersten start des programms.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@yalu
das "++" sollte nur verdeutlichen, dass man die variable zwischen den 
ausgaben veraendern muss. hoffte, dass dies ein paar raeder zum laufen 
bringen wuerde.

so, aber jetzt bin ich hier endgueltig raus
qq

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar jetzt geht es danke für alle die mir geholfen habe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.