Seite 1 von 1

Zufallszahlen mit C

Verfasst: 6. Dez 2010, 16:34
von Blue.Shark
Hi,

ich brauch für ein Programm in C zehn Zufallszahlen, die unterschiedlich sind.
ich hab das so gemacht:

Code: Alles auswählen

int zahl[10];

zahl[0] = rand()%(anzahl_zeilen)+1;
do{
zahl[1] = rand()%(anzahl_zeilen)+1;
}while (zahl[0] == zahl[1]);
do{
zahl[2] = rand()%(anzahl_zeilen)+1;
}while (zahl[2] == zahl[1]|| zahl[2] == zahl[0]);
do{
zahl[3] = rand()%(anzahl_zeilen)+1;
}while (zahl[3] == zahl[2]|| zahl[3] == zahl[1]||zahl[3] == zahl[0]);
do{
zahl[4] = rand()%(anzahl_zeilen)+1;
}while (zahl[4] == zahl[3]|| zahl[4] == zahl[2]||zahl[4] == zahl[1]||zahl[4] == zahl[0]);
do{
zahl[5] = rand()%(anzahl_zeilen)+1;
}while (zahl[5] == zahl[4]|| zahl[5] == zahl[3]||zahl[5] == zahl[2]||zahl[5] == zahl[1]||zahl[5] == zahl[0]);
do{
zahl[6] = rand()%(anzahl_zeilen)+1;
}while (zahl[6] == zahl[5]|| zahl[6] == zahl[4]||zahl[6] == zahl[3]||zahl[6] == zahl[2]||zahl[6] == zahl[1]||zahl[6] == zahl[0]);
do{
zahl[7] = rand()%(anzahl_zeilen)+1;
}while (zahl[7] == zahl[6]|| zahl[7] == zahl[5]||zahl[7] == zahl[4]||zahl[7] == zahl[3]||zahl[7] == zahl[2]||zahl[7] == zahl[1]||zahl[7] == zahl[0]);
do{
zahl[8] = rand()%(anzahl_zeilen)+1;
}while (zahl[8] == zahl[7]|| zahl[8] == zahl[6]||zahl[8] == zahl[5]||zahl[8] == zahl[4]||zahl[8] == zahl[3]||zahl[8] == zahl[2]||zahl[8] == zahl[1]||zahl[8] == zahl[0]);
do{
zahl[9] = rand()%(anzahl_zeilen)+1;
}while (zahl[9] == zahl[8]|| zahl[9] == zahl[7]||zahl[9] == zahl[6]||zahl[9] == zahl[5]||zahl[9] == zahl[4]||zahl[9] == zahl[3]||zahl[9] == zahl[2]||zahl[9] == zahl[1]||zahl[9] == zahl[0]);

Klappen tuht es natürlich. Aber meine Frage: Hat jemand eine Idee, wie das kürzer geht? Sieht nämlich etwas lang und kompliziert aus.
(Bin noch Programmier-Anfänger^^)

Re: Zufallszahlen mit C

Verfasst: 6. Dez 2010, 16:41
von pk93
sollte glaube ich funktionieren, hab ich jetzt mal so getippt. weiß leider nicht ob es for in C gibt oder nur in C++.

int zahl[10];
for ( int i = 0; i < 10; i++)
{
_ zahl = rand()&(anzahl_zeilen)+1);
_ for ( int j = 0; j < i; j++)
_ {
__ if(zahl===zahl[j])
__ {
___ i = i - 1;
___ j = 10;
__ }
_}
}

edit: einrücken funktioniert hier leider nicht

Re: Zufallszahlen mit C

Verfasst: 6. Dez 2010, 16:51
von Blue.Shark
pk93 hat geschrieben:sollte glaube ich funktionieren, hab ich jetzt mal so getippt. weiß leider nicht ob es for in C gibt oder nur in C++.

int zahl[10];
for ( int i = 0; i < 10; i++)
{
_ zahl = rand()&(anzahl_zeilen)+1);
_ for ( int j = 0; j < i; j++)
_ {
__ if(zahl===zahl[j])
__ {
___ i = i - 1;
___ j = 10;
__ }
_}
}

edit: einrücken funktioniert hier leider nicht


Vielen dank. müsste so klappen.
Und ja for schleifen sind auch in C^^

Re: Zufallszahlen mit C

Verfasst: 6. Dez 2010, 16:54
von pk93
dann kein problem.
bei mir ist das schon 3 1/2 jahre her. bin mittlerweile bei JSF und JSP

Re: Zufallszahlen mit C

Verfasst: 6. Dez 2010, 21:01
von Hail Eris
pk93 hat geschrieben:
int zahl[10];
for ( int i = 0; i < 10; i++)
{
_ zahl = rand()&(anzahl_zeilen)+1);
_ for ( int j = 0; j < i; j++)
_ {
__ if(zahl===zahl[j])
__ {
___ i = i - 1;
___ j = 10;
__ }
_}
}


$ gcc dings.c -std=c99
dings.c: In function 'main':
dings.c:11:19: error: 'anzahl_zeilen' undeclared (first use in this function)
dings.c:11:19: note: each undeclared identifier is reported only once for each function it appears in
dings.c:11:35: error: expected ';' before ')' token
dings.c:11:35: error: expected statement before ')' token
dings.c:14:13: error: expected expression before '=' token

Re: Zufallszahlen mit C

Verfasst: 8. Dez 2010, 16:18
von pk93
Hier der komplette Code

Code: Alles auswählen

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

void main()
{
	int zahl[10];
   int anzahl_zeilen = 10;
   randomize();
	for ( int i = 0; i < 10; i++)
	{

		zahl[i] = random(anzahl_zeilen)+1;
		for ( int j = 0; j < i; j++)
		{
			if(zahl[i]==zahl[j])
			{
				i = i - 1;
				j = 10;
			}
		}
	}

   for ( int i = 0; i<10; i++)
   	printf("%d\n",zahl[i]);
   getch();
}
edit: bei mir funktioniert meines, deines jedoch nicht xD

Re: Zufallszahlen mit C

Verfasst: 8. Dez 2010, 22:06
von Hail Eris
pk93 hat geschrieben:Hier der komplette Code

Code: Alles auswählen

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

void main()
{
	int zahl[10];
   int anzahl_zeilen = 10;
   randomize();
	for ( int i = 0; i < 10; i++)
	{

		zahl[i] = random(anzahl_zeilen)+1;
		for ( int j = 0; j < i; j++)
		{
			if(zahl[i]==zahl[j])
			{
				i = i - 1;
				j = 10;
			}
		}
	}

   for ( int i = 0; i<10; i++)
   	printf("%d\n",zahl[i]);
   getch();
}
$ gcc dings.c -std=c99
dings.c: In function 'main':
dings.c:10:4: warning: implicit declaration of function 'randomize'
dings.c:14:7: warning: implicit declaration of function 'random'
:dings.c:(.text+0x40): undefined reference to `randomize'
:dings.c:(.text+0x56): undefined reference to `random'
collect2: ld returned 1 exit status

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main(void)
{
	int anzahl_zeilen=10;
	int zahl[anzahl_zeilen];

	srand(time(NULL));
	
	for ( int i = 0; i < anzahl_zeilen; i++)
	{
		zahl[i] = rand();
		for ( int j = 0; j < i; j++)
		{
			if(zahl[i]==zahl[j])
			{
				i = i - 1;
				j = anzahl_zeilen;
			}
		}
		printf("%d\t",zahl[i]);
	}
}

Re: Zufallszahlen mit C

Verfasst: 9. Dez 2010, 19:48
von Blue.Shark
Also bei mir hat das alles geklappt

Re: Zufallszahlen mit C

Verfasst: 10. Dez 2010, 18:17
von Benu
Ja wenn man einen Headerfile rauslöscht und das ganze unter Linux kompiliert, ist es klar, dass er meckert. conio.h gibts nicht standardmäßig in Linux.

Re: Zufallszahlen mit C

Verfasst: 13. Dez 2010, 21:35
von Hail Eris
Schade, war nämlich MSYS/MinGW mit GCC 4.5.0. Im Path liegen einerseits /mingw/include, als auch das /include von Visual Studio 2008. Alle mit conio.h.

Im Übrigen hätte sich GCC bei einer fehlenden Header-Datei über eben jene fehlende Header-Datei beklagt.

Okay, ich spiele einfach mal bei dir mit, und nehme an, conio.h wäre tatsächlich das Problem. Wir haben die bekannte Rückgabe von GCC - die Funktionen random und randomize werden implizit verwendet. Implizit bedeutet, das sie als Funktionen verwendet werden, ohne als Funktion oder zumindestens als Funktionsprototyp deklariert worden zu sein. Wenn sie in einer Header-Datei sind, dann wurde sie nicht inkludiert. conio.h soll also der Missetäter sein... Nun habe ich zufälligerweise eine conio.h zur Hand, und schaue da mal herein. Huch, da werden die Funktionen random () und randomize () ja gar nicht definiert!
Schlussfolgerung: Ob conio.h nun inkludiert ist oder nicht, am von GCC gefundenen Fehler im Quelltext ändert das nichts.


Das hört sich jetzt vielleicht merkwürdig an, aber vielleicht sind random() und randomize() kein Teil der Standard-C-Bibliotheken nach dem C99-Standard? Vielleicht sollte man tatsächlich die in stdlib.h definierten Funktionen rand() und srand() benutzen?

http://msdn.microsoft.com/de-de/library/398ax69y.aspx
http://msdn.microsoft.com/de-de/library/f0d4wb4t.aspx


Unter Debian lässt sich meine Umsetzung übrigens auch anstandslos kompilieren und verwenden.

Re: Zufallszahlen mit C

Verfasst: 13. Dez 2010, 22:18
von Benu
Hail Eris hat geschrieben: Das hört sich jetzt vielleicht merkwürdig an, aber vielleicht sind random() und randomize() kein Teil der Standard-C-Bibliotheken nach dem C99-Standard?
Naja also ich muss dazu sagen, dass ich den Code selber noch nicht ausprobiert hatte. Der Verdacht auf Conio und Linux war nunmal der naheliegenste. Gehen wir mal davon aus, dass der Code beim Ersteller ohne Warnungen erstellt wurde, dann handelt es sich zu 99% um C99 Standard weil nunmal nur da Deklarationen in der for Schleife erlaubt sind. Vielleicht hat er auch bei sich einfach die Header Files angepasst und den Path geändert...aber wer kommt schon auf solche abstrusen Ideen :? Immerhin bekomm ich die selben Fehlermeldungen auch unter Win7 mit Codeblocks und MingW Compiler (alle Fehlermeldungen aktiviert).

Edit:
Btw grad gesehen, dass das C++ Code ist und nicht C :mrgreen:

Re: Zufallszahlen mit C

Verfasst: 14. Dez 2010, 22:45
von Piru
http://en.wikipedia.org/wiki/Pseudorand ... _generator
http://en.wikipedia.org/wiki/Linear_fee ... t_register

Wenn dus richtig anstellst kriegstes auch ohne effektive Wiederholung hin (Oder brauchst du unendlich viele Zufallswerte?). Bau einfach eins wo du mit unterschiedlichen Initialisierungsverktoren auf eine gleiche Anzahl von nutzbaren Werten kommst. Je nachdem wie viele das sein sollen machst du eine Moduloreduktion auf deine Systemzeit. Oder greife dir aus deiner Periode wahlfrei soviel Werte raus wie du brauchst. Mehr macht deine rand()-Funktion auch nicht.