WinFuture-Forum.de: Eine Zahl X In X Zufällige Teile Teilen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Eine Zahl X In X Zufällige Teile Teilen


#1 Mitglied ist offline   gpanda 

  • Gruppe: Mitglieder
  • Beiträge: 5
  • Beigetreten: 27. Februar 10
  • Reputation: 0

geschrieben 03. März 2010 - 20:05

Hi leute

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.
0

Anzeige



#2 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 03. März 2010 - 20:13

Suchst Du ein fertiges Programm oder einen Algorithmus? Ein Programm, das genau Deine Forderung erfüllt, ist mir nicht bekannt. Ist wohl doch zu speziell, um sowas anzubieten. Falls es um einen Algo geht, woran hapert es, was hast Du bisher und um welche Sprache geht es?
0

#3 Mitglied ist offline   gpanda 

  • Gruppe: Mitglieder
  • Beiträge: 5
  • Beigetreten: 27. Februar 10
  • Reputation: 0

geschrieben 03. März 2010 - 20:20

Danke für die schnelle Antwort.

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.
0

#4 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 03. März 2010 - 20:24

Vielleicht umreißt Du mal kurz, was Du vor hast. Eventuell gibt's ja auch eine andere/einfachere Lösung für das Problem.
0

#5 Mitglied ist offline   gpanda 

  • Gruppe: Mitglieder
  • Beiträge: 5
  • Beigetreten: 27. Februar 10
  • Reputation: 0

geschrieben 03. März 2010 - 20:47

Ich will eine Zahl in verschiedene zufällige Teile teilen.
0

#6 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 03. März 2010 - 21:05

Na gut, bloß keine Details :) Wie soll denn die Ausgabe aussehen (kommaseparierte Liste)? Wenn ich morgen etwas Zeit habe, setze ich mich mal dran. Heute ist noch Fußball und vor allem gesund werden angesagt.
0

#7 Mitglied ist offline   spookster 

  • Gruppe: aktive Mitglieder
  • Beiträge: 342
  • Beigetreten: 10. August 02
  • Reputation: 2
  • Wohnort:Münster

geschrieben 03. März 2010 - 21:20

he ich seh das problem nicht.
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?
0

#8 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 03. März 2010 - 22:55

Zitat

irgendein denkfehler?

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

0

#9 Mitglied ist offline   scy_ 

  • Gruppe: aktive Mitglieder
  • Beiträge: 120
  • Beigetreten: 02. März 10
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 04. März 2010 - 00:17

X := Zahl, die aufgeteilt werden soll
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

Mfg scy
Eingefügtes Bild
0

#10 Mitglied ist offline   martin_mt 

  • Gruppe: aktive Mitglieder
  • Beiträge: 515
  • Beigetreten: 19. August 02
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 04. März 2010 - 08:12

mit den einstellbaren nachkommastellen meint er wohl, dass er die zahl x nicht ganzzahlig zerlegen will, sondern z.b. folgendes:


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*
0

#11 Mitglied ist offline   scy_ 

  • Gruppe: aktive Mitglieder
  • Beiträge: 120
  • Beigetreten: 02. März 10
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 04. März 2010 - 12:46

achso na dann. nehm ich einfach Fließkommazahlen bei random und schneide ab der gewünschten Länge die Nachkommastellen ab.




Das ist jettz wohlgemerkt alles nicht wohldurchdacht gewesen von mir^^ geht sicher optimaler. 
Mfg scy
Eingefügtes Bild
0

#12 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 04. März 2010 - 13:19

Also irgendwie stehe ich auf dem Schlauch. Ich weiß wirklich nicht, wie die Algos von spookster oder scy_ funktionieren sollen? Bei beiden verstehe ich nicht die Idee der Zufallszahlenauswahl. Bei spookster sind wohl bloß x und y vertauscht. Als Beispiel soll 100 in 5 Teile zerlegt werden.

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

0

#13 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 04. März 2010 - 14:03

Ich würde das wie folgt implementieren, allerdings ohne Berücksichtigung von Nachkommazahlen.

Da ich gerade die PHP-Konsole offen hatte :rolleyes:

$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. :blush:
0

#14 Mitglied ist offline   scy_ 

  • Gruppe: aktive Mitglieder
  • Beiträge: 120
  • Beigetreten: 02. März 10
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 04. März 2010 - 14:11

mhhhh meine Random funktion ist eine Standartfunktion der entsprechen Bib. Beispielsweise Java Math.Random...
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.
Mfg scy
Eingefügtes Bild
0

#15 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 04. März 2010 - 14:30

Zitat

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

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 :rolleyes: 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

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0