Eine Zahl X In X Zufällige Teile Teilen
#1
geschrieben 03. März 2010 - 20:05
Suche ein Programm mit dem ich z.B. 5000 in 40 zufällige Teile teilen kann, wenn möglich mit einstellbaren Nachkommastellen. Und wenn möglich eine Funktion niedrigster Wert und höchster Wert zum Einstellen bei den generierten Zahlen.
Hoffe ihr könnt mir Helfen. Danke im voraus.
Anzeige
#2
geschrieben 03. März 2010 - 20:13
#3
geschrieben 03. März 2010 - 20:20
Vielleicht ist es im falschen Tread.
Eigentlich suche ich eher ein Pogramm. Ich kann leider nicht programmieren. Aber wenn es nicht allzu schwer ist kann ich versuchen zu programmieren. In der Schule hatten wir mal in Informatik was mit Visual Basic gemacht, aber das is schon lang her.
Habe Visual Studio 2008.
#4
geschrieben 03. März 2010 - 20:24
#5
geschrieben 03. März 2010 - 20:47
#6
geschrieben 03. März 2010 - 21:05
#7
geschrieben 03. März 2010 - 21:20
kurzes konstrukt (es sollen x zufällige zahlen gewürfelt werden die zusammen y ergeben.)
schleife mit x wiederholungen.
erster durchgang zufällige zahl k1 aus x-y per random auswürfeln
zweiter durchgang zufällige zahl k2 aus x-(y-1)-k1 auswürfeln
zweiter durchgang zufällige zahl k3 aus x-(y-2)-(k1+k2) auswürfeln
usw.
letzter durchgang rest ergibt sich von alleine.
irgendein denkfehler?
#8
geschrieben 03. März 2010 - 22:55
Zitat
So trivial ist es leider nicht. Was ist z.B. wenn eine Zufallszahl dem Rest entspricht aber nicht die letzte ist? Dazu kommt noch, daß man auch obere und untere Grenzen für Zufallszahlen angeben können soll. Dann muß man die Grenzen bei Bedarf dynamisch anpassen, damit man noch x Abschnitte bekommt und kein zu kleiner/großer Rest übrig bleibt. Der einfachste Weg ist natürlich x-1 Zufallszahlen zu generieren und dann im Nachhinein die Bedingungen zu prüfen. Im schlimmsten Fall terminiert der Algo dann aber nicht.
Dieser Beitrag wurde von Mr. Floppy bearbeitet: 03. März 2010 - 23:02
#9
geschrieben 04. März 2010 - 00:17
Y := Anzahl der Teile
Z := Ausgabeliste der Zahlen
WHILE (Y > 0) { a = random(0, (X-Y)-SUM(Z)); ##Zufallszahl zwischen der Summe der aktuel geratenen Zahlen und (X-Y) Z.add(a); ## geratene Zahl zur Liste hinzufügen Y-- }
Die Grenzen kann man soweit ich weiß in fast jeder Programiersprache in einer bereits exisiterenden random-Funktion einfügen.
Sollte dem nicht so sein, füge ich eine weiter WHILE-Schleife ein. Das würde allerdings die Effizienz des Alg. extrem in dezimieren.
Das mit den einstellbaren Nachkommastellen versteh ich nicht.
Aber es würde mich interessieren wofür man sowas braucht^^
Edith sagt: Dekrementierung vergessen
Dieser Beitrag wurde von scy_ bearbeitet: 04. März 2010 - 14:11
#10
geschrieben 04. März 2010 - 08:12
X= 3 (gegebene zahl)
Y= 10 (anzahl zerlegungen)
Z = 0.09,0.07,0.05,0.7,0.1,1,0.6,0.12,0.09,0.18
nur als beispiel
lässt sich natürlich auch auf die spitze treiben mit
zerlegen 1 in 500 teile oder so...
mit entsprechenden nachkommastellen möglich
und irgendwie kommt mir diese aufgabenstellung bekannt vor.. wenn ich nur wüsste woher *grübel*
#11
geschrieben 04. März 2010 - 12:46
Das ist jettz wohlgemerkt alles nicht wohldurchdacht gewesen von mir^^ geht sicher optimaler.
#12
geschrieben 04. März 2010 - 13:19
spookster:
1. k1 aus 5 - 100 = random(-95) ? wie gesagt, x und y vertauscht
scy_:
1. Y = 5, Z = {}, a = random(0, 95) = 73
2. Y = 4, Z = {73}, a = random(73, 96) = 81 ?
Es würde halbwegs* funktionieren, wenn
a = random(SUM(Z), (X-Y)) - SUM(Z) oder einfacher a = random(0, (X-Y-SUM(Z)))wäre, dann bleibt aber immer noch das Problem mit den Minima/Maxima der Zufallszahlen.
*Das letzte Element muß der Rest und keine Zufallszahl aus diesem sein!
Dieser Beitrag wurde von Mr. Floppy bearbeitet: 04. März 2010 - 13:46
#13
geschrieben 04. März 2010 - 14:03
Da ich gerade die PHP-Konsole offen hatte
$x = 100; $z = array(); $y = 5; while(--$y > 0) { $a = rand(0,$x-array_sum($z)); $z[]=$a; } $z[] = $x - array_sum($z); foreach ($z as $val) { echo $val . "\n"; }
Einige Erklärungen:
- Das Minimum ist _immer_ null.
- Das Maximum berechnet sich aus der aufzuteilenden Zahl minus der Summe aller gespeicherten Zahlen
- Die Berechung der Schleife geht nur, bis $y -1, da die letzte Zahl lediglich eine Differenz zwischen $x und der Summe der gespeicherten Zahlen darstellt.
- Der Algorithmus ist nicht wirklich fair. Das heißt, dass die zufälligen Zahlen immer kleiner werden. Aber egal, da die Summe immer erreicht wird.
#14
geschrieben 04. März 2010 - 14:11
und die letzte Zahl muss!! nicht der Rest sein.
random(a,b) gibt eine zufällige ganze/Fließkomma -Zahl zwischen a und b aus.
Also gibt:
random(0, (X-Y)-SUM(Z))
eine Zufallszahl aus, die maximal so groß ist, wie die größte Zahl - Summe der geratenen Zahlen - Anzahl der verbleibenden Schritte:
Zur Erklärung:
Subtraktion von der Summe der Zahlen, damit die Zufallszahl auch ganz sicher die Summe nicht über Y hebt.
Subtraktion von den verbleibenden Schritten, damit im nächsten Schritt immer!! noch mindestens 1 mögliche Zahl geraten werden kann, die ungleich 0 ist.
Der letzte Punkt ist auch der Grund, warum das letzte raten kein Rest ist.
Bsp:
Y=200
x=3
a1=random(0,197)=100
a2=random(0,98)=98
a3=random(0,1)=1
so es ist alles geraten, nur das im worst case beim letzten Fall es halt nur eine Möglichkeit gibt aus der geraten werden kann.
P.S. Bei meiner Funktion is nen Dreher drinne, sry.
Mann kann auch statt -X -(x-1) nehmen, aber ich wollte es nicht unnötig verkomplizieren.
#15
geschrieben 04. März 2010 - 14:30
Zitat
Der letzte Punkt ist auch der Grund, warum das letzte raten kein Rest ist.
Bsp:
Y=200
x=3
a1=random(0,197)=100
a2=random(0,98)=98
a3=random(0,1)=1
Und wenn a2 < 98 ist, was doch eher wahrscheinlich ist? Selbst in Deinem Beispiel könnte a3 mit einer Wahrscheinlichkeit von 50% 0 sein, womit ein Rest übrig bleibt. Außerdem ist 100+98+1 in den gängigen Zahlensystemen nicht 200 Knackpunkt ist wie gesagt nicht das Aufteilen einer Zahl sondern die Randbedingung für die obere und untere Grenze. Diese Grenzen müßten schon vor der Berechnung geprüft werden, weil manche Kombinationen nicht funktionieren, wenn z.B. Y/X > max. Um das Problem zu veranschaulichen:
X=3
Y=200
min=20
max=100
a1 = 50
a2 = 25, min < 25 < max, muß aber verworfen werden, weil a3 > max sein wird
a2 = 75 => min = 75, weil 125 + 20 < 200
a3 = REST
Man muß also ständig prüfen, ob man mit den verbleibenden Schritten * max noch auf Y kommt und ob dabei keine Zahl kleiner min wird. Klingt einfach, ist es aber nicht.
Dieser Beitrag wurde von Mr. Floppy bearbeitet: 04. März 2010 - 14:45