Forum: PC-Programmierung Probleme mit Zufallsgenerator in C


von Anfänger (Gast)


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
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
int i1 = rand();
5
int i2 = rand();
6
  
7
int main(int argc, char *argv[])
8
{
9
  // 30 bit-zufallszahl
10
  int zufall = (i1<<15)+i2;
11
12
  printf ("%i",&zufall);
13
  system("PAUSE");  
14
  return 0;
15
}
16
17
int zufall(const int a, const int b)
18
{
19
  // zielbereich
20
  int c = b-a;
21
  
22
  // c muß größer als 0 sein
23
  // c muß kleiner als RAND_MAX sein
24
  // obergrenze, über der rand verworfen wird
25
26
  int d = RAND_MAX - (RAND_MAX % c);
27
  int e;
28
  do
29
  {
30
    e = rand();
31
  }while (e < d);
32
  return (e % c) + a;
33
34
}

von Sven P. (Gast)


Lesenswert?

srand()

von Anfänger (Gast)


Lesenswert?

Wo steht das und was meinst du damit?

von chris (Gast)


Lesenswert?

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

von Anfänger (Gast)


Lesenswert?

Was muss ich den in print einfügen?

von Uhu U. (uhu)


Lesenswert?

Nichts einfügen, was weglassen...

von Anfänger (Gast)


Lesenswert?

Ja aber was?

von Uhu U. (uhu)


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...

von Anfänger (Gast)


Lesenswert?

Kannst du mir nicht einfach sagen was ich machen muss?

von Uhu U. (uhu)


Lesenswert?

Du willst doch was lernen, oder?

Beitrag "Re: Probleme mit Zufallsgenerator in C"

von Anfänger (Gast)


Lesenswert?

Ja und was soll ich mit dem Beitrag nochmal anfangen?

von Anfänger (Gast)


Lesenswert?

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

von Michi (Gast)


Lesenswert?

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

von Gast (Gast)


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

von Anfänger (Gast)


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.

von Anfänger (Gast)


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.

von Anfänger (Gast)


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.
1
{
2
int i1 = rand();
3
int i2 = rand();
4
  // 30 bit-zufallszahl
5
  int zufall = (i1<<15)+i2;
6
  
7
  printf ("%i\n\n\n",zufall);
8
  printf ("%i\n\n\n",zufall);
9
  printf ("%i\n\n\n",zufall);
10
  printf ("%i\n\n\n",zufall);
11
  
12
  system("PAUSE");  
13
  return 0;
14
}
15
16
17
int zufall(const int a, const int b)
18
{
19
  // zielbereich
20
  int c = b-a;
21
  
22
  // c muß größer als 0 sein
23
  // c muß kleiner als RAND_MAX sein
24
  // obergrenze, über der rand verworfen wird
25
26
  int d = RAND_MAX - (RAND_MAX % c);
27
  int e;
28
  do
29
  {
30
    e = rand();
31
  }while (e < d);
32
  return (e % c) + a;
33
34
}

von yalu (Gast)


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:
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
int zufall(const int a, const int b)
5
{
6
  // generiert eine Zufallszahl im Bereich a <= x <= b
7
  // zielbereich
8
  int c = b - a + 1;                       // <=========
9
  
10
  // c muß größer als 0 sein
11
  // c muß kleiner als RAND_MAX sein
12
  // obergrenze, über der rand verworfen wird
13
14
  int d = RAND_MAX - (RAND_MAX % c);
15
  int e;
16
  do
17
    e = rand();
18
  while (e >= d);                          // <=========
19
  return (e % c) + a;
20
21
}
22
23
int main(int argc, char *argv[])
24
{
25
  int i;
26
27
  // Ausgeben von 10 Zufallszahlen im Bereich 5 <= x <= 67
28
  for(i=0; i<10; i++)
29
    printf ("%i\n", zufall(5, 67));        // <=========
30
  return 0;
31
}

von Anfänger (Gast)


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;
}

von Gast (Gast)


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

von Anfänger (Gast)


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");

von Gast (Gast)


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

von yalu (Gast)


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
1
  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:
1
#include <time.h>
2
...
3
int main(int argc, char *argv[])
4
{
5
  int i;
6
7
  srand(time(NULL));
8
...

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.

von Anfänger (Gast)


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;

}

von yalu (Gast)


Lesenswert?

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

oder den Wert der Funktion zufall
1
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.

von Gast (Gast)


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

von Anfänger (Gast)


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.

von Gast (Gast)


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

von Anfänger (Gast)


Lesenswert?

Alles klar jetzt geht es danke für alle die mir geholfen habe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.