Zufallszahlen mit C

Hier kann über alles diskutiert werden, wirklich alles. Betonung liegt auf "diskutiert", das ist also kein Freischein zum Spammen.
(Beitragszähler deaktiviert)
Antworten
Benutzeravatar
Blue.Shark
großer Laubbär
Beiträge: 2864
Registriert: 5. Okt 2008, 21:27

Zufallszahlen mit C

Beitrag von Blue.Shark » 6. Dez 2010, 16:34

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^^)
Macht alle bei meinem Spiel mit -> Wörter raten
Meine aktuelle User-Idee: Errungenschaften auf Zeit
Meine Wunsch-Idee: Das Haus der Statistiken, Liebligskarte: Etume - das Flusstal. Andere Userideen: Zauber der globalen Wunder

pk93
Teidam
Beiträge: 163
Registriert: 2. Jan 2010, 19:07

Re: Zufallszahlen mit C

Beitrag von pk93 » 6. Dez 2010, 16:41

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
Bin kein PlayerKiller. pk sind meine Initialien.

Benutzeravatar
Blue.Shark
großer Laubbär
Beiträge: 2864
Registriert: 5. Okt 2008, 21:27

Re: Zufallszahlen mit C

Beitrag von Blue.Shark » 6. Dez 2010, 16:51

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^^
Macht alle bei meinem Spiel mit -> Wörter raten
Meine aktuelle User-Idee: Errungenschaften auf Zeit
Meine Wunsch-Idee: Das Haus der Statistiken, Liebligskarte: Etume - das Flusstal. Andere Userideen: Zauber der globalen Wunder

pk93
Teidam
Beiträge: 163
Registriert: 2. Jan 2010, 19:07

Re: Zufallszahlen mit C

Beitrag von pk93 » 6. Dez 2010, 16:54

dann kein problem.
bei mir ist das schon 3 1/2 jahre her. bin mittlerweile bei JSF und JSP
Bin kein PlayerKiller. pk sind meine Initialien.

Hail Eris
Kaklatron
Beiträge: 15
Registriert: 6. Apr 2010, 17:33
Wohnort: 48° 50′ 0″ S, 123° 20′ 0″ W

Re: Zufallszahlen mit C

Beitrag von Hail Eris » 6. Dez 2010, 21:01

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
Viva Discordia!

pk93
Teidam
Beiträge: 163
Registriert: 2. Jan 2010, 19:07

Re: Zufallszahlen mit C

Beitrag von pk93 » 8. Dez 2010, 16:18

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
Zuletzt geändert von pk93 am 9. Dez 2010, 09:55, insgesamt 1-mal geändert.
Bin kein PlayerKiller. pk sind meine Initialien.

Hail Eris
Kaklatron
Beiträge: 15
Registriert: 6. Apr 2010, 17:33
Wohnort: 48° 50′ 0″ S, 123° 20′ 0″ W

Re: Zufallszahlen mit C

Beitrag von Hail Eris » 8. Dez 2010, 22:06

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]);
	}
}
Viva Discordia!

Benutzeravatar
Blue.Shark
großer Laubbär
Beiträge: 2864
Registriert: 5. Okt 2008, 21:27

Re: Zufallszahlen mit C

Beitrag von Blue.Shark » 9. Dez 2010, 19:48

Also bei mir hat das alles geklappt
Macht alle bei meinem Spiel mit -> Wörter raten
Meine aktuelle User-Idee: Errungenschaften auf Zeit
Meine Wunsch-Idee: Das Haus der Statistiken, Liebligskarte: Etume - das Flusstal. Andere Userideen: Zauber der globalen Wunder

Benu
Zauberer der Bergwiesen
Beiträge: 658
Registriert: 26. Okt 2008, 13:21

Re: Zufallszahlen mit C

Beitrag von Benu » 10. Dez 2010, 18:17

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.
http://fwrails.net
lokale Styes in Google Chrome
lokale Styles in Gologle folgen...
I'm beginning to feel like a Spam God

Hail Eris
Kaklatron
Beiträge: 15
Registriert: 6. Apr 2010, 17:33
Wohnort: 48° 50′ 0″ S, 123° 20′ 0″ W

Re: Zufallszahlen mit C

Beitrag von Hail Eris » 13. Dez 2010, 21:35

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.
Viva Discordia!

Benu
Zauberer der Bergwiesen
Beiträge: 658
Registriert: 26. Okt 2008, 13:21

Re: Zufallszahlen mit C

Beitrag von Benu » 13. Dez 2010, 22:18

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:
http://fwrails.net
lokale Styes in Google Chrome
lokale Styles in Gologle folgen...
I'm beginning to feel like a Spam God

Benutzeravatar
Piru
Kopolaspinne
Beiträge: 733
Registriert: 28. Okt 2006, 10:49

Re: Zufallszahlen mit C

Beitrag von Piru » 14. Dez 2010, 22:45

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

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste