Entwickler-Ecke

Sonstiges (Delphi) - würfelprogramm+ ausgabe der häufigkeit der zahlen 1 bis 6


GothicSoldier - Mo 06.06.05 17:26
Titel: würfelprogramm+ ausgabe der häufigkeit der zahlen 1 bis 6
1000 zahlen von 1 bis 6 würfelt und anschließend die absoluten und relativen Häufigkeiten für die Zahlen 1 bis 6 ausgibt.

hinweis: würfelt man eine 3, so ist die anzahl der 3-en um 1 zu vergrößern

würfelt man eine x, so ist die anzahl der x-en um 1 zu vergrößern

--> anzahl[x]:=anzahl[x]+1
Random(n) liefert Zahlen von 0 bis n-1

Kann mir irgendjemand weiterhelfen wie ich rangehen muss um das hinzubekommen?


hallo - Mo 06.06.05 17:43

Du machst einfach ein Array[1..6] of strings und würfle: Wenn du eine 1 Würfelst: inc(arrayname[1])

Das ganze Würfeln packst du in eine Schleife rein: for i:=1 to 1000 do

Danach berechnest du noch die Warscheinlichkeit. Die jeweiligen Anzahlen von 1 steht in arrayname[1] usw. drin.

Wichtig: Wenn du mit random arbeitest, bau nach möglichkeit eine variable Verzögerung (min. 1ms) zwischen dem einzelnen Würfeln ein um Verschiedene Werte zu erhalten!


Neidhard von Reuental - Mo 06.06.05 17:46

wenn du ein array of string machst kannste das nicht im 1 erhöhen.nimm integer dafür ^^


hallo - Mo 06.06.05 17:54

Ohhh!!!! :oops: :oops: :oops: Hatte mal wieder nicht richtig aufgepasst!


F34r0fTh3D4rk - Mo 06.06.05 17:59


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var
  wuerfel: array [1..6of integer;
  i: integer;
begin
  randomize;
  for i := 1 to 1000 do
    inc(wuerfel[random(6) + 1]);
end;

wenns mit inc net funzt dann mach das so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var
  wuerfel: array [1..6of integer;
  i, c: integer;
begin
  randomize;
  for i := 1 to 1000 do
    begin
      c := random(6) + 1;
      wuerfel[c] := wuerfel[c] + 1;
    end;
end;


UGrohne - Mo 06.06.05 18:03

Hallo,
der Titel Deines Beitrages ist nicht aussagekräftigt genug. Man weiß nicht genau, um was es geht. Bitte ändere ihn entsprechend!
Dies kannst Du tun, indem Du in Deinem ersten Beitrag auf "Edit" klickst und den Titel dort änderst.

Dazu hier auch noch der Auszug aus den Richtlinien:
Richtlinien hat folgendes geschrieben:
1.2 Beiträge
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist. Eine Pseudocodezeile oder die Nennung des Objektes, um welches es sich in dem Beitrag handelt, helfen da schon mehr weiter. Wenn Du beispielsweise wissen möchtest, wie es möglich ist, eine Integer-Variable in das String-Format zu konvertieren, würde ein Beitrag wie etwa "Integer zu String" oder "Integerkonvertierung" anderen Forenmitgliedern einen kurzen Überblick über die eigentliche Fragestellung verschaffen. So ist es möglich gezielter Lösungen für Probleme zu finden. Zudem solltest du immer daran denken: Der Fragesteller möchte etwas von den anderen Usern - nicht umgekehrt.


Vielen Dank

Gruß,

Uwe


GothicSoldier - Mo 06.06.05 18:44

Hey, danke für eure hilfe ; )

Ihr seid die Besten ^_^


MarkusZi - Mo 06.06.05 19:00

Insgesamt denke ich brauchst du das, oder?


GothicSoldier - Mo 06.06.05 19:04


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var
  wuerfel: array [1..6of integer;
  i, c: integer;
begin
  randomize;
  for i := 1 to 1000 do
    begin
      c := random(6) + 1;
      wuerfel[c] := wuerfel[c] + 1;
    end;
end;


wenn ich mich nach dem quellcode richte, ist denn da ein edit1 feld noch notwendig?

ich komm mit der Ein und Ausgabe nicht klar :(


GothicSoldier - Mo 06.06.05 19:05

boah.....du bist ja super, konntest meine gedanken lesen *G*

dankeschön =)


GothicSoldier - Mo 06.06.05 19:10


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen}
  public
    { Public-Deklarationen}
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
   i, c, anzahl: integer;
   wuerfel : array [1..6of integer;
begin
     anzahl := StrToInt(Edit1.Text);
     for i := 1 to 6 do wuerfel[i] := 0;
     randomize;
     for i := 1 to anzahl do
     begin
        c := random(6) + 1;
        wuerfel[c] := wuerfel[c] + 1;
     end;
     abs1.Caption := IntToStr(wuerfel[1]);
     abs2.Caption := IntToStr(wuerfel[2]);
     abs3.Caption := IntToStr(wuerfel[3]);
     abs4.Caption := IntToStr(wuerfel[4]);
     abs5.Caption := IntToStr(wuerfel[5]);
     abs6.Caption := IntToStr(wuerfel[6]);
     rel1.Caption := FloatToStr(wuerfel[1]/anzahl);
     rel2.Caption := FloatToStr(wuerfel[2]/anzahl);
     rel3.Caption := FloatToStr(wuerfel[3]/anzahl);
     rel4.Caption := FloatToStr(wuerfel[4]/anzahl);
     rel5.Caption := FloatToStr(wuerfel[5]/anzahl);
     rel6.Caption := FloatToStr(wuerfel[6]/anzahl);
     ProgressBar1.Position := Round((wuerfel[1]/anzahl)*100);
     ProgressBar2.Position := Round((wuerfel[2]/anzahl)*100);
     ProgressBar3.Position := Round((wuerfel[3]/anzahl)*100);
     ProgressBar4.Position := Round((wuerfel[4]/anzahl)*100);
     ProgressBar5.Position := Round((wuerfel[5]/anzahl)*100);
     ProgressBar6.Position := Round((wuerfel[6]/anzahl)*100);

end;

end.


wärs möglich, dass du mir einiges erklärst damit ich das vollkommen verstehe?
will das ja nicht nur so übernehmen, sondern auch gern verstehen =)


Delphi-Quelltext
1:
  ProgressBar1.Position := Round((wuerfel[1]/anzahl)*100);                    
was sagt der befehl aus?


Delphi-Quelltext
1:
rel1.Caption := FloatToStr(wuerfel[1]/anzahl);                    

wieso muss ich durch die anzahl teilen?

ich nehm gerne jede erläuterung entgegen :)


F34r0fTh3D4rk - Mo 06.06.05 19:18


Delphi-Quelltext
1:
2:
 
   ProgressBar1.Position := Round((wuerfel[1]/anzahl)*100);

setzt die position der progressbar auf den umgerechneten wert

und das mim teilen ist die relative wahrscheinlichkeit :wink:


MarkusZi - Mo 06.06.05 19:23

Also die ProgressBar hab ich genommen, weil man damit relativ schnell und einfach Balken darstellen kann. Man stellt sie nur auf Orientation := pbVertical (im Ojektinspektor) und auf Smooth := TRUE, so dass keine Abstufungen drin sind.

Die Labels Rel1 bis Rel6 sind also die relativen Häufigkeiten, Abs1 bis Abs6 die absoluten....

reicht das?

Ich denke alles andere ist ziemlich selbsterklärend!


GothicSoldier - Mo 06.06.05 19:23

soo und da habe ich noch eine frage:


Delphi-Quelltext
1:
rel6: TLabel;                    



Delphi-Quelltext
1:
abs1: TLabel;                    


sind solche 'speziellen' labels nötig? gehen denn nicht auch 'normale' labels?

uuund wie kann ich machen, dass nicht 0,165 angezeigt wird, sondern 16,5% meinetwegen?

*liebschau* danke vielmals :)


MarkusZi - Mo 06.06.05 19:27

Ich hab die Labels nur umbenannt, damit man sie besser auseinanderhalten kann!

Also:


Quelltext
1:
     rel1.Caption := FloatToStr((wuerfel[1]/anzahl)*100)+'%';                    


GothicSoldier - Mo 06.06.05 19:33

gut. danke. nun sind alle fragen geklärt =)

ich bedanke mich bei ALLEN. (: