wie lasse ich hochzählen [closed]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Vidde

Betreff: wie lasse ich hochzählen [closed]

BeitragMo, Nov 03, 2008 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo @ alle,

ich bin nach wie vor blutender anfänger und knapper seit tagen an der selben problematik - ohne erfolg.

ich möchte per zufall die 4 werte A, B, C und D hochzählen lassen, aber so, dass diese zusammen genau den Wert X ergeben. kann mir jemand einen denkanstoß verpassen?

wenn X = 100 sollte dann das ergebnis wie flogt aussehen:

A = 15
B = 36
C = 28
D = 21

oder:
A = 15
B = 36
C = 28
D = 21

im Extremfall auch:
A = 0
B = 0
C = 100
D = 0
Gern der Zeiten gedenk ich, als alle Glieder gelenkig - bis auf eins. Diese Zeiten kehren nie wieder, steif sind nun alle Glieder - bis auf eins.
  • Zuletzt bearbeitet von Vidde am Di, Nov 04, 2008 16:01, insgesamt einmal bearbeitet

D2006

Administrator

BeitragMo, Nov 03, 2008 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Du brauchst auf jedenfall die Zufallsfunktion Rand (Vorher SeedRnd MilliSecs benutzen!)

In einer Variable speicherst du die gewünschte Summe (zB halt die 100)

A is ne Zufallszahl zwischen 0 und 100 (also Rand(summe))
B is ne Zufallszahl zwischen 0 und 100 minus A --> Rand(summe-A)
C = Rand(summe-A-B)
D = summe - A - B - C

Sollte so klappen.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Vidde

BeitragMo, Nov 03, 2008 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen Dank für die rasche antwort. so klappt das schon.

das problem ist nun nur noch, dass der Wert A überwiegend große werte erhält, da bei ihm ja immer die möglichkeit auf 100 besteht. und die ergebnisse zu optimieren dachte ich da eher an eine schleife, welche die werte mehrmals hintereinander langsamer hochzäht bis X erreicht ist.
Gern der Zeiten gedenk ich, als alle Glieder gelenkig - bis auf eins. Diese Zeiten kehren nie wieder, steif sind nun alle Glieder - bis auf eins.
 

Mathe

BeitragMo, Nov 03, 2008 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Zahl% = Input("Deine Zahl: ")

SeedRnd MilliSecs()

A = Rnd(0,Zahl/Rnd(1,10))
B = Rnd(0,Zahl - A)
C = Rnd(0,Zahl - A - B)
D = Zahl - (A+B+C)
Gesammt = A + B + C + D

Print "A: " + A
Print "B: " + B
Print "C: " + C
Print "D: " + D
Print "A+B+C+D = " + Gesammt


Edit:
A = Rnd(0,Zahl/Rnd(1,10)) <-- Die Zahl wird einfach am Anfang durch einen Zufallswert von 1 bis 10 geteil so wird ein A mal kleiner mal größer...
Windoof nein DANKE => ArchLinux Wink
  • Zuletzt bearbeitet von Mathe am Mo, Nov 03, 2008 17:44, insgesamt 3-mal bearbeitet

Vidde

BeitragMo, Nov 03, 2008 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
so hab ich´s schon umgesetzt. nach mehrmaligem durchlauf hat sich meine befürchtung bewahrheitet:

A = 50,7 % von X
B = 21,5 % von X
C = 15,6 % von X
D = 12,2 % von X

keine wirkliche chancengleichheit Crying or Very sad
Gern der Zeiten gedenk ich, als alle Glieder gelenkig - bis auf eins. Diese Zeiten kehren nie wieder, steif sind nun alle Glieder - bis auf eins.

SpionAtom

BeitragMo, Nov 03, 2008 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
So haben theoretisch alle Werte dieselbe Chance kleiner zu werden:

Edit: Frag mich nicht, warum ich bei 100 anfange und dann runterzähle. Man kann natürlich auch bei 0 anfangen und dann hochzählen... gefällt mir sogar besser, und For-Next Schleife passt auch besser:
Code: [AUSKLAPPEN]
SeedRnd MilliSecs()
   A = 0: B = 0: C = 0: D = 0

   For i = 1 To 100   
      Select Rand(4)
         Case 1: A = A + 1
         Case 2: B = B + 1
         Case 3: C = C + 1
         Case 4: D = D + 1
      End Select
   Next
   
   Print A: Print B: Print C: Print D
   WaitKey
End
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
  • Zuletzt bearbeitet von SpionAtom am Mo, Nov 03, 2008 20:25, insgesamt 4-mal bearbeitet
 

Mathe

BeitragMo, Nov 03, 2008 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
aber es fehlt noch was SeedRnd Millisecs() sonst sind beim mehrmaligen Programmstart immer alle Werte gleich...
Windoof nein DANKE => ArchLinux Wink

ozzi789

BeitragMo, Nov 03, 2008 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuchs mal so
so vertauscht es einfach die Werte sodass ned immer A der grösste ist, ist nicht optimal aber ist besser Smile
Code: [AUSKLAPPEN]
Zahl% = Input("Deine Zahl: ")

SeedRnd MilliSecs()

a = Rnd(0,Zahl/Rnd(1,10))
b = Rnd(0,Zahl - A)
c = Rnd(0,Zahl - A - B)
d = Zahl - (a+b+c)
Gesammt = a + b + c + d

zuf=rnd(1,4)

a_s=a
b_s=b
c_s=c

if zuf = 1
a=b_s
c=a_s
b=c_s
endif

if zuf=2
a=c_s
b=a_s
c=b_s
endif

if zuf=3
a=b_s
b=c_s
c=a_s
endif


Print "A: " + a +" old A:"+a_s
Print "B: " + b+" old B:"+b_s
Print "C: " + c+" old C:"+c_s
Print "D: " + d+" old D:"+d_s
Print "a+b+c+d = " + Gesammt
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Vidde

BeitragDi, Nov 04, 2008 9:56
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen dank an alle - ich bin schwert begeistert wie schnell man hier geholfen bekommt. das hat mir sehr weitergeholfen Laughing

hab jetzt die ganze zeit runterzählen lassen (ab 30 statt 100) und bis grade waren alle tests brauchbar- bis auf den letzten. da war der erste wert plötzlich negativ (unfassbar).

lasse jetzt hochzählen wie ursprünglich geplant und es funzzt super - nochmals besten dank an alle kopfzerbrecher.
Gern der Zeiten gedenk ich, als alle Glieder gelenkig - bis auf eins. Diese Zeiten kehren nie wieder, steif sind nun alle Glieder - bis auf eins.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group