Werteverteilung.

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Matthias

Betreff: Werteverteilung.

BeitragDi, März 15, 2011 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay.

Ich habe da ein kleines Problem und hoffe auf Hilfe. Very Happy

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

BeitragDi, März 15, 2011 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 15, 2011 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau. Der Berechnungsvorgang ist das Problem.
Es soll ja auch gleichmäßig von den Zellen subtrahiert werden.

M0rgenstern

BeitragDi, März 15, 2011 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, März 15, 2011 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 15, 2011 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile

M0rgenstern

BeitragDi, März 15, 2011 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 15, 2011 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BladeRunner

Moderator

BeitragDi, März 15, 2011 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 16, 2011 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Hat zwar etwas gedauert aber ich habe das Problem gelößt.

Dank BladeRunner seinen Lösungsansatz. Very Happy

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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group