Werteverteilung.
Übersicht

MatthiasBetreff: Werteverteilung. |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hay.
Ich habe da ein kleines Problem und hoffe auf Hilfe. ![]() Also. Ich habe 9 Zellen mit Werten. Und jedesmal wenn ich mit der Maus auf eine Zelle clicke wird ein Zuffalswert hinzuardiert. Alle Zellen zusammen sollen aber immer 100 ergeben. Also muss demzufolge bei anderen Zellen was Subtrahiert werden. Allerdings nur bei Zellen die größer als null sind. Und so gleichmäßig wie möglich. Hier mal der Code. Code: [AUSKLAPPEN] Graphics 800,600,32,2 SetBuffer BackBuffer() Timer=CreateTimer(60) MaxZ=8:ZSize=50:Y=100 Dim ZVar#(MaxZ),ZRand(MaxZ) ZVar(0)=63:ZVar(3)=37 Repeat:Cls:Ges=0 MX=MouseX():MY=MouseY():MD=MouseHit(1) For Z=0 To MaxZ X=100+Z*60 Ges=Ges+ZVar(Z) Color 160,160,160:Rect X,Y,ZSize,ZSize Color 255,255,0 Text X+ZSize*.5,Y+5,"G"+ZVar(Z),1 Color 255,255,255 Text X+ZSize*.5,Y+30,ZRand(Z),1 If MD=1 And MX>X And MX<X+ZSize Then If MY<Y+ZSize Then AddZVar(Z) End If Next Text 100+60*(MaxZ+1),Y,"="+Ges Flip 0:WaitTimer(Timer) Until KeyDown(1)=1 End Function AddZVar(Z) R=Rand(5,20) ZRand(Z)=R Q=ZVar(Z)+R If Q>100 Then Q=100 ZVar(Z)=Q End Function |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und was genau ist dein Problem?
Weißt du nicht, wie du das berechnen sollst, funktioneirt irgendwas nicht, oder wo liegt dein Problem? Lg, M0rgenstern |
||
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Genau. Der Berechnungsvorgang ist das Problem.
Es soll ja auch gleichmäßig von den Zellen subtrahiert werden. |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, ich würds so machen:
Wenn auf eine Zelle geklickt wurde und der Wert addierrt wurde, dann merkst du dir diese Zelle und gehst du alle Zellen durch und rechnest sie zusammen. Dann berechnest du wie weit dieser Wert von 100 entfernt ist. Entsprechend versuchst du einen möglichst kleinen Teiler zu finden, der jedoch über 1 liegen sollte Beispiel: 110, also 10 über 100. Man könnte also in 10 Zellen 1 abziehen. Oder in 5 Zellen 2, was praktischer wäre da du ansonsten an die veränderte Zelle kommen würdest was ja sicher nicht gewollt ist. Du sorgst also dafür, dass immer weniger als 9 Zellen angesprochen werden müssen und sprichst dann zufällig eingie Zellen an und ziehst einen entsprechenden Wert ab, wobei du drauf achtest dass a) keine bereits angesprochene Zelle wieder benutzt werden darf und die angeklickte auch nicht. Hoffe, dass das einigermaßen verständlich ist. Lg, M0rgenstern |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es geht auch rein auf mathematischem Wege (wers mag):
Code: [AUSKLAPPEN] Graphics 500,300,0,2
SetBuffer BackBuffer() Local Timer=CreateTimer(58) Local Count,MX,MY,MH,Summe# Dim Array#(9) For Count=0 To 9 Array(Count)=10 Next While Not KeyHit(1) MX=MouseX()/50 MY=MouseY()/40 MH=MouseDown(1) If MH=1 Then Array(MX)=Array(MX)+(100-Array(MX))*0.1 End If Color 48,48,48:Rect MX*50,0,50,400,1 Line 0,100,550,100 Line 0,200,550,200 Color 160,0,0 For Count=0 To 9 If MH=1 Then If MX<>Count Then Array(Count)=Array(Count)*0.9 End If End If Color 200+((MX=Count)*55),55,55 Rect Count*50,100,50,Array(Count),1 Next Summe=0 For Count=0 To 9 Summe=Summe+Array(Count) Next Text 20,20,Summe WaitTimer Timer Flip 0 Cls Wend End |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe es verstanden.
Dadurch ist es aber nicht mehr gleichmäßig. Weil eine zufällige Zelle gewählt wurde. Du kannst es ja mal im Beispielprogramm ausprobieren. ![]() |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, es ist so gleichmäßig wie möglich, da immer eine höchstmögliche Anzahl an Zellen gewählt wird. Wenn weniger als 8 Zellen gewählt werden können dann musst du dir halt ein Muster überlegen nach dem du das abarbeiten willst.
Lg, M0rgenstern |
||
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@hectic.
Danke das ist schon ein recht guter Ansatz. Doch den Wert den ich zu der Zelle hinzuadieren will der ist Statich und nicht abhängig des momentanen Zelleninhaltes. Das ist ja das Problem. Code: [AUSKLAPPEN] If MH=1 Then R=20 Array(MX)=Array(MX)+R ; (100-Array(MX))*0.1 End If |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Den Zufallswert ermittelst Du und speicherst ihn in einer Variable.
Nun ermittelst Du wieviele Zellen ausser der aktuellen >= Zufallswert/9 sind. Die Zellen die kleiner diesem Wert sind werden auf 0 gesetzt, nachdem ihre absolute Differenz zu Zufallswert/9 gespeichert wurde. Die Summe dieser Differenzen addierst Du auf Zufallswert, nachdem du ihn um (Zellen<Wert/9)*Wert/9 reduziert hast, und teilst ihn durch die Zahl der Zellen >= Zufallswert/9. Das ist nun der Wert den Du von den anderen Zellen abziehen musst. Wenn die Zahl nicht exakt aufgeht (spricht Zahl mod anzahl <>0 kannst Du diesen Rest einerweise von den Zellen >0 abziehen. Fertig. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hay. Hat zwar etwas gedauert aber ich habe das Problem gelößt.
Dank BladeRunner seinen Lösungsansatz. ![]() Code: [AUSKLAPPEN] Graphics 800,600,32,2 SetBuffer BackBuffer() Timer=CreateTimer(60) Global MaxZ=8 ZSize=50:Y=100 Dim ZVar#(MaxZ),ZRand(MaxZ) ZVar(0)=100 Repeat:Cls:Ges#=0 MX=MouseX():MY=MouseY():MD=MouseHit(1) For Z=0 To MaxZ X=100+Z*60 If MD=1 And MX>X And MX<X+ZSize Then If MY<Y+ZSize Then AddZVar(Z) End If Ges=Ges+ZVar(Z) Color 160,160,160:Rect X,Y,ZSize,ZSize Color 255,255,0 Text X+ZSize*.5,Y+5,"G"+Floor(ZVar(Z)),1 Color 255,255,255 Text X+ZSize*.5,Y+30,ZRand(Z),1 Next Text 100+60*(MaxZ+1),Y,"="+Ges Flip 0:WaitTimer(Timer) Until KeyDown(1)=1 End Function AddZVar(Z) R=Rand(5,20) ZRand(Z)=R If ZVar(Z)+R>100 Then R=100-ZVar(Z) For I=0 To MaxZ If ZVar(I)>0 And I<>Z Then ZC=ZC+1 Next Diff#=R/Float(ZC) For I=0 To MaxZ If ZVar(I)>0 And I<>Z Then ZVar(I)=ZVar(I)-Diff If ZVar(I)<0 Then R=R+ZVar(I) ZVar(I)=0 End If Next Q=ZVar(Z)+R If Q>100 Then Q=100 ZVar(Z)=Q End Function |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group