Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi leute sorry wenn ich euch schon wieder nerve!Das andere Problem hat sich gelöst!Hat funguniert!Jetzt hab ich wieder mal ne frage!Versuche gerade in C 10 verschiedene Zufallszahlen auszugeben!Hab am Anfang mal ein paar sachen ausprobiert um mich mit rand() vertraut zu machen aber um 10 Zufallszahlen auszugeben benötigt man aber auch srand() was hat es mit srand() auf sich?Wie binde ich es in ein Programm ein?

Hab da mal ein Programm geschrieben was einen Minimalwert und einen Maximalwert einliest und dann so lange Zufallszahlen ausgiebt, bis der Maximalwert erreicht wurde!

#include<stdlib.h>

#include"zufall.h"

int main (void)

{

int min,max,zufall1;

printf("Bitte geben sie den Minimalwerte ein!\n");

scanf("%d",&min);

fflush(stdin);

printf("Bitte geben sie den Maximalwert ein!\n");

scanf("%d",&max);

fflush(stdin);

do{

printf("\n");

zufall1=zufall(min,max);

printf("Ihre Zufallszahl lautet: %d",zufall1);

}while(max!=zufall1);

getchar();

}

---------------------------------------------------------------------------------------------------------

Funktion:

int zufall(int min, int max)

{

int x;

x=rand()%(max-min+1)+min;

return x;

}

Geschrieben

Sets a random starting point.

void srand(

unsigned int seed

);

Parameters

seed

Seed for random-number generation

Remarks

The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1.

Geschrieben
rand

<stdlib.h>

cplusplus.com

int rand ( void );

Generate random number.

Returns a pseudo-random number in the range from 0 to RAND_MAX constant. This is generated by an algorithm that returns a series of non-related numbers each time is called. This algorithm should be initialized to different starting points using function srand to generate more realistic random numbers.

RAND_MAX is a constant defined in stdlib.h. Its default value is implementation defined.

Parameters.

(none)

Return Value.

An integer value between 0 and RAND_MAX.

Portability.

Defined in ANSI-C.

Example.

/* rand example */

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main ()

{

/* initialize random generator */

srand ( time(NULL) );

/* generate some random numbers */

printf ("A number between 0 and RAND_MAX (%d): %d\n", RAND_MAX, rand());

printf ("A number between 0 and 99: %d\n", rand()%100);

printf ("A number between 20 and 29: %d\n", rand()%10+20);

return 0;

}

Output:

A number between 0 and RAND_MAX (32767): 30159

A number between 0 and 99: 72

A number between 20 and 29: 23

A good way to generate almost-true random numbers is to initialize the random algorithm using srand with the current time in seconds as parameter, as obtained from time function included in <time.h>.

And, generally, a good way to get an integer random number between a range is to perform a module (%) operation on a result provided by rand():

thus rand()%25 would be a random number between 0 and 24, both included.

srand

<stdlib.h>

cplusplus.com

void rand ( unsigned int seed );

Initialize random number generator.

Uses seed parameter to set a new starting point for generating random numbers with rand.

If seed is set to 1 the generator is reinitialized to its initial value as before any call to rand or srand.

In order to generate true random numbers it is suggested to use as seed a value that changes often, like the one returned by time function included in <time.h> (the number of seconds elapsed since newyear 1970).

Parameters.

seed

An integer value to be used as starting point with the pseudo-random number generator algorithm.

Return Value.

(none)

Portability.

Defined in ANSI-C.

Example.

/* rand/srand example */

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main ()

{

/* initialize random generator */

srand ( time(NULL) );

/* generate some random numbers */

printf ("A number between 0 and 100: %d\n", rand()%100);

printf ("A number between 20 and 30: %d\n", rand()%10+20);

return 0;

}

Output:

A number between 0 and 100: 93

A number between 20 and 30: 21

Quelle: http://www.cplusplus.com/ref/

Geschrieben

Hallo,

Ich bin mir nicht so ganz sicher, ob es wirklich hilft, wenn seitenlange auszüge aus englisch-sprachigen Manual-Pages oder Web-Seiten gepostet werden. Da sollte eigentlich der Link reichen.

Das Thema rand()/srand() wurde schon öfter diskutiert, die Suchfunktion des Boards sollte also einige Treffer zu Tage bringen.

rand() beruht auf einem Pseudozufallszahlengenerator. Diese haben die Eigenschaft, identische Zufallszahlenreihen zu liefern, sofern sie nicht mit einem zufälligen Wert initialisiert werden (bei gleichen Initialisierungswerten werden auch hier gleiche Zahlenketten geliefert, was unter Umständen nützlich sein kann).

Empfehlenswert ist eine Initialisierung über die Zeit-Funktion oder das Auslesen eines Prozessor-Registers; einige Prozessoren besitzen "Zufallsregister" alternativ lassen sich auch Instruction-Counter oder Time-Register verwenden (wobei das recht komplex und nicht portabel ist).

Die einfachste Variante wäre somit der Aufruf von:

srand ( time(NULL) );

Nic

Geschrieben

@nic_power

Danke für deine Erklärung!Das mit den links hat mir aber auch ein wenig geholfen!

Hab in mein Programm mal srand ( time(0) ); eingefügt!Jetzt bringt er wenigstens schon jedes mal ander Zufallszahlne, auch wenn ich den gleichen Startwert eingebe!Super!

Werde mich einfach weiter damit beschäftigen, bis es funzt!Wenn ich noch Fragen habe melde ich mich einfach!

Danke @all

Geschrieben

Hi Leute warum funzt das blöde Prog. nicht?Kann mir jemand helfen?Ich will nur 10 Zufallszahlen ausgeben und danach den Benutzer nach einer Zahl fragen und prüfen ob diese Zahl vorhanden ist oder nicht!Muss das dumme Array abfragen,will aber nicht funzen!

int zufall1[11]={};

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

int main (void)

{

int i,ausgabe,zahl,merker=0,a;

srand ( time(0) );

for(i=0;i<11;i++)

{

ausgabe=rand();

zufall1=ausgabe;

}

for(i=0;i<11;i++)

{

printf("%d %d \n",zufall1,i);

}

printf("Bitte geben sie eine Zahl an:\n");

scanf("%d",&zahl);

fflush(stdin);

for(a=0;a<11;a++);

{

if(zahl==zufall1[a])

{

merker=1;

}

else

{

merker=0;

}

}

fflush(stdin);

if(merker==1)

{

printf("Ihre zahl ist vorhanden!");

getchar();

}

else

{

printf("Ihre zahl ist nicht vorhanden!");

getchar();

}

getchar();

}

Geschrieben

Hallo,


fflush(stdin);


for(a=0;a<11;a++);
{
if(zahl==zufall1[a])
{
merker=1;
}
else
{
merker=0;
}

}
[/php]

Das semikolon hinter der Schleife ist zuviel (if/else wird nur einmal und nicht innerhalb der Schleife ausgeführt).

Ausserdem wird (wenn if/else innerhalb der Schleife wäre) der merker auf 0 gesetzt auf wenn die Zahl bereits gefunden wurde.

Das fflush(stdin) sollte ausserdem raus (flush() auf Eingabestroeme ist _nicht_ definiert!

Nic

Geschrieben

Hallo,

Eine for-Schleife zu verwenden ist schon ok. Aber:


for(a=0;a<11;a++)
;
[/php]

Mit dieser Schleife wird nur a hochgezählt, nicht jedoch der if/else Zweig innerhalb der Schleife ausgeführt. Nach Ablauf der Schleife enthält a den Wert 11.

[php]
if(zahl==zufall1[a]) {
merker=1;
} else {
merker=0;

}

Jetzt vergleichst Du das 12. Element Deines Arrays mit der Zahl. Da Du das Array aber nur als zufall1[11] deklariert hast, greifst Du auf nicht allokierten und initialisierten Speicher zu. Richtiger wäre:


for(a=0;a<11;a++) {
if(zahl==zufall1[a]) {
merker=1;
} else {
merker=0;
}
}
[/php]

Leider funktioniert dies aber auch nicht, da Du wenn Du die Zahl gefunden (und damit den merker auf 1 gesetzt) hast, die Schleife nicht abbrichst. D.h. im nächsten Durchlauf wird der merker wieder auf 0 gesetzt (obwohl das element bereits gefunden wurde). Entweder Du brichst die Schleife ab, oder Du entfernst den "else"-Fall und initialisierst den merker vor der Schleife mit 0.

Nic

Geschrieben

Danke für deine Hilfe!Hab vorher merker mit 0 initialisiert und den else Zweig entfernt jetzt funzt es!Kannst du mir noch mal erklären,warum er es falsch macht, wenn ich den else Zweig drin lasse?

Ich möchte jetzt noch ausgeben, welches Element die bestimmte Zufallszahl ist (nur wenn sie vorhanden ist!);

Geschrieben

Hallo,

spiel doch einfach mal die Schleife auf dem Papier oder im Kopf durch. Der Einfachheit halber gehe ich davon aus, dass das zu findende Element im ersten Feld des Arrays steht.

Beim ersten Schleifendurchlauf findest Du die Zahl (der Vergleich trifft zu) und Du setzt Deinen merker auf den Wert "1". im zweiten Durchlauf schlägt der Vergleich fehlt und Du setzt den merker (im "else"-Fall) wieder zurück auf den Wert 0, obwohl Du bereits einen Treffer hattest. Nach dem Beenden der kompletten Schleife trägt Dein merker den Wert "0" (Ausnahme: Es handelt sich um das letzte Element in Deinem Array).

Nic

Geschrieben

Oder man schaut es sich mal mit C++ an:

Kompletter lauffähiger code:


#include <stdlib.h>
#include <time.h>
#include <set>
#include <iostream>
using namespace std;

int main(int argc, char * argv[])
{
// Set damit jede Zufallszahl nur einmal vorkommt
set<int> zufall;
srand((unsigned)time(0));

// Solange laufen bis 10 unterschiedliche Zufallszahlen im set sind
while(zufall.size()< 10)
zufall.insert(rand());

cout<<"Geben Sie bitte eine Zahl ein";


// Hilfsausgabe das man auch mal die richtige Zahl erwischt beim testen ))
copy(zufall.begin(),zufall.end(),ostream_iterator<int>(cout," "));


// Benutzer nach Zahl fragen
int suchzahl;
cin>>suchzahl;

// Und prüfen ob die vorhanden ist.
if(zufall.find(suchzahl)!=zufall.end())
cout<<"\nIhre Zahl war vorhanden";
else
cout<<"\nIhre Zahl war NICHT vorhanden";



return 0;
}
[/PHP]

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...