Jackery IFA Fireplace

C Würfel erstellen in C, wie?

necoicould

Lieutenant
Registriert
Feb. 2009
Beiträge
537
Ich will mir 5 Würfel erstellen, also 5 Variablen, die per Zufall eine integer Zahl von 1-6 zugewiesen bekommen. ausgegeben werden sollen dann alle würfeln. Wie mach ich das?
 
Einfach mal ne Fkt bauen, die wüfelt und dann n 5er Array (oder Variablen) die in ner Schleife mit der Random-Fkt beschrieben werden.

*edit* die "normale" Random Fkt gibt dir Werte zwischen 0 und Random_max (wie groß Random_Max ist weis ich auch net). Dann kannst einfach "zufallszahl % 6 +1" machen. Dann hast du werte zwischen 1 und 6
 
Die erste Regel des Programmierens ist die Fähigkeit zu suchen und zu lesen.
Hier wurde GAR NICHT gesucht!


int rand ( void );
 
Zuletzt bearbeitet:
Kauf dir folgendes Buch: "C For Dummies" :p

Oder du benutzt die Suchfunktion
 
:P

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

int main ()
{

  srand ( time(NULL) );

int w1 = rand() % 6;
int w2 = rand() % 6;
int w3 = rand() % 6;
int w4 = rand() % 6;
int w5 = rand() % 6;

  printf ("w1: %d\n", w1);
  printf ("w2: %d\n", w2);
  printf ("w3: %d\n", w3);
  printf ("w4: %d\n", w4);
  printf ("w5: %d\n", w5);

  return 0;
}

Klappt erst einmal :D Dann lasst uns Kniffeln :P
 
Das so zu machen erzeugt nicht gleichmäßig verteilte Zufallszahlen. Beispiel:

RAND_MAX ist 10 und rand() gäbe gleichverteilte Zufallszahlen zwischen 0 und 10 aus. Also
jedes Ergebnis von 0 bis 10 hat eine Wahrscheinlichkeit von 1/10.
Dann bekäme man mit rand() % 6 + 1 1, 2, 3 und 4 jeweils mit einer Wahrscheinlichkeit von 2/10,
während 5 und 6 1/10 hätten. Das wäre kein fairer Würfel mehr. Ich suche mal eine bessere Funktion
heraus...

€: Hier von mir: https://github.com/SirDzstic/boskop-ng/blob/master/src/rrand.c
Die Funktion rrand(m) spuckt gleichverteilte Zufallszahlen im Bereich von 0 bis m aus, auch wenn
die Ausgabe der benutzten Zufallszahlenquelle in einem anderen Bereich liegt.
 
Zuletzt bearbeitet:
Ja ok, erst einmal reicht mir das mal aus damit ich überhaupt 5 Zahlen (egal wie zufällig das jetzt ist) generiert bekomme.

Jetzt will ich folgendes machen. Wenn w1 bis w5 eine 1 beinhaltet dann soll er alle Augenzahlen die eine 1 beinhalten addieren.

Code:
If (w1||w2||w3||w4||w5=1){
// wie kann ich hier sagen, dass er alle Ws die = 1 sind addieren soll und in eine neue variable 
// speichern soll, sagen wir Bed1)

Edit: Danke für den Code
 
Kauf dir ein Buch. Wir können dir hier keine C-Vorlesung geben. Das, was da steht, zeugt jedenfalls von
massivem Unverständnis.
 
Ich weiß ich weiß, bin noch ganz am Anfang, das Buch vor mir hilft auch nicht viel weiter...
Ich frage mich, wenn er hier diese Randomzahlen generiert, er das auch bei der IF abfrage unten bescheid bekommt, welche Zahl nun dort ist oder nicht. Wie es scheint ist der IF-Abfrage es egal was da ist, er stimmt da immer zu und gibt printf aus, obwohl das ja garnicht gehen kann mit der 7. Würde mich freuen, wenn Ihr mir nur hier weiterhelfen würdet, das würde mir sehr helfen. danke

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

int main ()
{

  srand ( time(NULL) );
int i;
int w1 = rand() % 6;
int w2 = rand() % 6;
int w3 = rand() % 6;
int w4 = rand() % 6;
int w5 = rand() % 6;

  printf ("w1: %d\n", w1);
  printf ("w2: %d\n", w2);
  printf ("w3: %d\n", w3);
  printf ("w4: %d\n", w4);
  printf ("w5: %d\n", w5);



if ((w1=7)){
	printf("Es ist eine 7 vorhanden");
}

}
 
du musst aufpassen. ( wl = 7 ) != ( wl == 7 )
vielelicht solltest du mal bissle besser dein buch lesen!
 
Das hatte ich gemacht, ging nicht, aber jetzt geht doch^^ Ok vielen Dank!
 
Hi,

asdfman hat natürlich recht, aber da RAND_MAX größer als 32766 sein sollte ist die
different zwischen kleinster und größter Wahrscheinlichkeit recht gering.
http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/

Bei Zahlen zwischen 1-6 (also 0 bis 5 Plus 1):
für RAND_MAX gilt RAND_MAX = 32767

32767 / 6 = 5461,166 => 5461 * 6 = 32766
=> angenommen RAND_MAX= 32766 ist rand() % 6 gleichmäßig verteilt mit p= 1 / (32766 / 5461) = 1/6

bei RAND_MAX= 32767 hat rand()%6 aber 0 eine Möglichkeit mehr!
0 hat 5462 Möglichkeiten aber 1-5 5461 Möglichkeiten:

für rand()%6 ==0 gilt also : p= 1 / (32767 / 5462) = 1/5,9990845844013181984621017942146
für rand()%6 == 1bis 5 gilt also : p= 1 / (32767 / 5461) = 1/ 6,0001831166453030580479765610694

und RAND_MAX ist meistens größer wie hier angenommen und es gilt "je größer RAND_MAX und je kleiner N (rand()%N) desto gleichmäßiger verteilt sind die Zahlen". In deinem Fall denke ich kannst Du es gut so lassen, wie du es oben gemacht hast aber denk dran x modulo n (x>=n) ergibt immer Zahlen 0<=x%n < n.
Also rand() % 6 ergibt 0 - 5 und (rand() % 6) +1 ergibt 1-6.
Ergänzung ()

Pass bei den Vergleichen auf!

if(x=1)
{
...
}
wird IMMER wahr und x ist danach immer 1 auch wenn es vorher was anderes war!
Das Ergebnis einer Zuweisung (also nur ein =) ist immer True!
Ergänzung ()

und zu
If (w1||w2||w3||w4||w5=1){

|| oder && trennen für sich logische Ausdrücke und JEDE Zahl die nicht 0 ist ist TRUE
http://www.dr-seifert-online.de/Downloads/vergleichsoperatoren.pdf

wenn du wissen möchtest ob eine w eins ist dann so:

If (w1==1||w2==1||w3==1||w4==1||w5==1)
 
Jo, habs auch gemacht so. Bis jetzt klappt's relativ gut.

Mein jetziges Problem ist nur noch, dass wenn 2 int zahlen geteilt werden er mir eine INT ausgibt.

habe sozusagen:

int x
int y
int erg

erg = x/y

da spuckt er mir eine int aus

wenn ich int erg zu float mache, gibt er mir ganz was verrücktes aus.
Wie kann man das machen, das ich aus dem Quotienten zweier INTS eine Dezimalzahl bekomme.
 
Casten. Außerdem sind wir immer noch kein Ersatz für ein Buch. Komm nicht bei jeder Kleinigkeit, die du nicht
kannst hier hin, sondern arbeite erstmal ein Buch durch und habe ein vernünftiges Verständnis von der Sache.
 
Also wir haben alle irgendwann mal angefangen zu programmieren aber du kannst doch nicht bei jeder Kleinigkeit hier nachfragen ^^

Ich werde dir hier keine Lösungen präsentieren sondern mehr so etwas wie ein paar Denkanstöße.

Angenommen du willst irgendwann mehr als nur 5 Würfel haben. Dann wäre es mehr als blöd wenn du jetzt zB 1000 Variablen per Hand erstellen musst. Für diesen Zweck wäre es hilfreich sich mit Arrays zu beschäftigen.

Und dann wäre dein Problem "Alle Würfel, die eine 1 würfeln addieren" ziemlich einfach zu lösen. Vorraussetzungen dafür ist jedoch, dass du dich mit Schleifen beschäftigst.

Mal als Pseudocode:

Code:
int wuerfel_array[wuerfel_anzahlo];
int zaehle_1en=0;

Für alle wuerfel in wuerfel_array:     // Schleife
    wuerfel = rand(5) + 1;
    
   Wenn wuerfel == 1  
         zaehle_1en=zaehle_1en +1;
   END Wenn
Ende Schleife

Ausgabe("Anzahl 1en: "+zaehle_1en);

Jetzt habe ich es dir im Prinzip doch schon vorgekaut obwohl ich es nicht wollte. Ich habe aber mal bewusst darauf verzichtet alles in C-Code zu schreiben. Das Prinzip sollte so aber klar sein.

Auf das Problem mit deiner Konvertierung gehe ich auch ganz kurz mal ein. Bei deinem Problem sieht das also so aus:

Code:
float = int / int

Jetzt muss man sich aber klar machen in welcher Reihenfolge das Ganze abläuft. Natürlich erwartet die Zuweisung "=" genau einen Wert weshalb die rechte Seite zuerst berechnet wird. Auf der rechten Seite stehen nur 2 int-Werte weshalb natürlich auch die Integer-Division benutzt wird und ein Integer als Ergebnis herauskommt. Anschließend wird dem Float ein Integer zugewiesen was dann aber nicht das Ergebnis ist was du erwartest.

Code:
int x=5;
int y=2;
float ergebnis = x/y;

Die Division würde hier 2 ergeben (weil wir hier mit Integern rechnen) und ergebnis bekommt dann entsprechend auch eine 2 übergeben. Da es sich hier um einen float handelt wird zwar eine Nachkommastelle eingefügt aber da der Integer dafür keine Informationen enhält müsste das Ergebnis 2.0 sein.
Wenn das nicht das ist was du willst musst du irgendwie aus den Integern einen Float machen bevor du dividierst. Dann erhällst du auch einen Float als Ergebnis der Division und ergebnis bekommt den richtigen Wert welcher in meinem Beispiel 2.5 ist.
Da die Zufallsfunktion aber Integer zieht musst du irgendwie deine Integer-Variablen nach Float konvertieren. Das nennt man casten. Ich hoffe, dass du das auch irgendwie alleine hinkriegst ;)
 
Zurück
Oben