Autor Beitrag
FabianS
Hält's aus hier
Beiträge: 8

Microsoft Windows 98SE
Delphi 6 Personal
BeitragVerfasst: Mi 19.01.05 22:02 
Hallo Leute,
ich bin hier im Forum zwar neu, aber in Delphi nicht ganz unbewandert.
Ich habe ein Problem mit dem Rechnen in Matritzen. Theorethisch weis ich, wie es geht, aber mit einer zusätzlichen Schwierigkeit ist es für mich sehr verwirrend.

Also zur Beschreibung:
Mit folgendem Code erstelle ich eine Matrix. Die Grösse wird von einer Variablen festgelegt. Diese Variable ist "anzahl".

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  for a := 1 to anzahl do
    begin
      for b := 1 to anzahl do
        begin
          for c := 1 to anzahl do
            begin
              Matrix[a][b][c] := 0;
            end;
        end;
    end;


Nun möchte ich per Zufall eine bestimmte anzahl an Koordinaten aus der Matrix auf den Wert 1 stellen. Zum Beispiel 10% aller möglichen Koordinaten.

Gut die Anzahl davon errechne ich mit:
ausblenden Delphi-Quelltext
1:
2:
prozent := 10 / 100;
anzahl_mit_wert_1 := prozent * (anzahl * anzahl * anzahl);


--> Aber wie kann ich diese nun ZUFÄLLIG verteilen?

und es kommt noch ein weiteres erschwernis hinzu:

KEINER der werte soll im radius von der variable "umgebung := 1;" einen anderen wert mit einer 1 haben...

Ich habe es leider noch nicht geschafft das Problem zu bewältigen. Mein Hauptproblem ist, was ich aber zugeben muss, nicht so dahr das mit der Umgebung. Das kann man noch "relativ" einfach überprüfen... Mein Problem ist, wie ich erstmal diese x% erstmal ZUFÄLLIG verteilt bekomme!!!

MfG Fabian

p.s. hoffe war die richtige sparte, da ich hier im forum bin und mir nciht sicher war ob das hier richtig eingeordnet ist. ACHSO: und bitte sprecht nicht mit zu vielen FACHWÖRTERN der Mathematik OHNE sie zu erklären. Bin recht gut in Mathe, aber erst in der 11.1! Also wäre nett wenn ihr darauf Rücksicht nehmen könntet...

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
Moderiert von user profile iconChristian S.: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Mi 19.01.2005 um 21:16
myukew
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 19.01.05 22:58 
wenn du einmal randomize() aufrufst liefert rand(i) eine zufallszahl zwischen null und i-1 glaub ich (kuck in der hilfe). du jetzt also 1/10 der felder auf 1 wenn du eine forschleife bis zu felder/10 hast in der du eine zufällige koordinate auf 1 setzt. mit einer if anweisung kannst du prüfen ob das feld schon 1 ist, damit auch wirklich 1/10 auf 1 sind und nicht weniger weil ein paar "doppelt" auf 1 gesetzt wurden
NeoInDerMATRIX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 245

Win95, Win98(+se), WinNT, Win2000, WinME, WinXP(+pro), VISTA, Linux(SuSe), DOS [MultiMon(3)], Vista
D6 PeE + (FP 2.0l) + D3 Pe + D2005+ D2006 Arch
BeitragVerfasst: Mi 19.01.05 23:34 
Hi,

und willkommen.

Zum Füllen der Matrize mit NULL benutze keine schleife!

ausblenden 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:
Type
 TMat: Array[0..X, 0..Y, 0..Z]of Integer;

Procedure ClearMat(Var AMat: tMat);
Begin
 ZeroMemory(@AMat, SizeOf(AMat));
End;

Function CheckXYZ(AMat: tMat; X, Y, Z: Integer);
Begin
 Result:=TRUE;
 If AMat[X, Y, Z]=0 Then
   Result:=FALSE;
 // ... alle anderen bereiche testen
End;

Procedure RandMat(Var AMat: tMat; P: Integer);
Var
 L: Integer;
Begin
 For L:=0 to P * SizeOf(AMata) div 100 do
  Begin
   // Random wert erzeugen für X,Y, Z und erst testen ob er gültig ist dann setzen auf 1
   AMat[X, Y, Z]:=1;
  End;
End;


So ungefähr könnte das aussehen.
Bei den Mathe und den Testen des bereiches können fehler sein.
Aber es sollte ausbau fähig sein, und deinem Ziel entsprechend.

Cu
Neo
FabianS Threadstarter
Hält's aus hier
Beiträge: 8

Microsoft Windows 98SE
Delphi 6 Personal
BeitragVerfasst: Do 20.01.05 00:16 
Das sieht sehr vielversprechend aus, Neo, danke.
Wobei ich gleich zugebe, das ich nicht alles verstehe!

Was ich verstanden habe:

Die Type Definiton: Du erstellst einen Type, der TMat heisst und ein Array ist. Es ist von der grösse variabel und ist Integer.

Die Procedure: ClearMat soll wahrscheinlich die matrix auf 0 setzten..? Aber wie und wieso sie funktioniert verstehe ich nicht.

Die Function: CheckXYZ testet ob ein Punkt in der Matrix den Wert 0 hat, oder nicht. Sie leifert mir True oder False zurück. (bei =0 gibt es False)
Was meinst du dort mit "andre Bereiche Testen"? meinst du das mit distance wie ich es wollte? Mh gut, das ist auch noch gut verständlich...

Die Procedure: RandMat soll irgendwie mir Zufallswerte liefern... (wie verstehe ich nicht). Sie soll sich der Hilfe der function CheckXYZ bedienen um nur gewollte punkte auf 1 setzen zu dürfen... Was soll das "P: Integer"? wofür ist "P * SizeOf(AMata) div 100" gut, und was bewirkt es?

Tut mir leid, da sich das nicht auf Anhieb verstehe... aber ich finde nachfragen ist besser als unwissend bleiben...

Liebe Grüße,
Fabian
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 20.01.05 01:35 
FabianS hat folgendes geschrieben:
Die Type Definiton: Du erstellst einen Type, der TMat heisst und ein Array ist. Es ist von der grösse variabel und ist Integer.

Das Array is statisch von der Größe festgelegt ... Von 0,0,0 bis X,Y,Z ...

FabianS hat folgendes geschrieben:
Die Procedure: ClearMat soll wahrscheinlich die matrix auf 0 setzten..? Aber wie und wieso sie funktioniert verstehe ich nicht.

ZeroMemory setzt einen kontinuirlichen Speicherblock auf 0. Bei integern ist dies der Wert für "0" :D

FabianS hat folgendes geschrieben:
Was soll das "P: Integer"? wofür ist "P * SizeOf(AMata) div 100" gut, und was bewirkt es?

P * SizeOf(AMata) div 100 gibt dir an, wie viele Elemente er auf 1 setzen muss ...

@Neo: Müsste div 400 sein, da du noch durch die Größe des Basis-Typs teilen musst.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
NeoInDerMATRIX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 245

Win95, Win98(+se), WinNT, Win2000, WinME, WinXP(+pro), VISTA, Linux(SuSe), DOS [MultiMon(3)], Vista
D6 PeE + (FP 2.0l) + D3 Pe + D2005+ D2006 Arch
BeitragVerfasst: Do 20.01.05 03:59 
Hi,

@BenBE: Ja sorry vergessen, was würde ich ohne deine Koreckturen machen.

@FabianS:
Mit dem anderen Bereich testen meine ich das du das If ... Then noch ausbauen must um deine vorgabe zu unterstützt. Du hattest ja gesagt das um einen zu setzendem Wert kein weiterer sein soll. Deshalb must du dieses hier noch ausbauen. Aber das überlasse ich dir.
Mit dem RandMat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Procedure RandMat(Var AMat: tMat; P: Integer);  
Var  
 L: Integer;  
 X, Y, Z: Integer;
Begin  
 Randomize;
 For L:=0 to P * SizeOf(AMata) div 100 do  
  Begin
   While CheckXYZ(AMat, Rand(MaximumXWert), Rand(MaximumYWert), Rand(MaximumZWert) do ;
   AMat[X, Y, Z]:=1;  
  End;  
End;


Kann sein das ich da jetzt ein par fehler drin habe. Aber so ungefähr sollte das gehen.

Cu
Neo

P.S.: @BenBE: Vergess nicht mich zu korigieren. :wink: