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
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...
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
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.
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.
>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.
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
intzufall(constinta,constintb)
5
{
6
// generiert eine Zufallszahl im Bereich a <= x <= b
7
// zielbereich
8
intc=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
intd=RAND_MAX-(RAND_MAX%c);
15
inte;
16
do
17
e=rand();
18
while(e>=d);// <=========
19
return(e%c)+a;
20
21
}
22
23
intmain(intargc,char*argv[])
24
{
25
inti;
26
27
// Ausgeben von 10 Zufallszahlen im Bereich 5 <= x <= 67
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;
}
@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
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");
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
> 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
intmain(intargc,char*argv[])
4
{
5
inti;
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.
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;
}
Du musst dich entscheiden, ob du die Variablezufall
1
intzufall=(i1<<15)+i2;
oder den Wert der Funktionzufall
1
intzufall(constinta,constintb)
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.
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
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.
@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