Probleme mit Zufallsgenerator in C

Gast #1086585
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
}
Gast #1086667
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
Gast #1086680
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
}
Gast #1086693
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
}
Gast #1086713
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;
}
Gast #1086715
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
Gast #1086734
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
Gast #1086739
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.
Gast #1086741
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;

}
Gast #1086751
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.
Gast #1086753
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.
Gast #1086756
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren