Font
[thread]11787[/thread]

N Zahlen ermitteln mit Gesamtwert 100 (page 3)

Readers: 12


<< |< 1 2 3 4 5 >| >> 45 entries, 5 pages
KurtZ
 2008-05-11 03:24
#109550 #109550
User since
2007-12-13
411 articles
BenutzerIn
[default_avatar]
@Gast: du berechnest hier anzahl+2=5 Zahlen, aber der Ansatz stimmt. Er kam mir auch zuerst in den Sinn, allerdings sind die Ergebnisse ganz anders als bei meinem Algo. Bei dir werden die meisten Reihen ein Element > 50 haben, der Rest wird dann exponentiell kleiner. Bei mir hingegen liegen die Elemente viel enger beieinander.
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-05-11 03:25
#109551 #109551
User since
2007-12-13
411 articles
BenutzerIn
[default_avatar]
lichtkind+2008-05-11 00:01:04--
warum so kompliziert. nimm 2 zufallzahlen und als dritte zahl den rest zu 100 :)

und wenn die 2 Zufallszahlen zusammen mehr als 100 ergeben?
TMTOWTDYOG (there's more than one way to dig your own grave)
Dubu
 2008-05-11 04:13
#109552 #109552
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
Ist eigentlich die Null als Summand zugelassen?

Wenn nicht, dann muss man noch berücksichtigen, dass nach einer Zufallszahl evtl. der Rest zu klein ist, um noch die weiteren Zahlen unterzubringen. Beispiel: Wenn ich zuerst 99 würfele, ist das zwar kleiner als 100, aber ich kann keine zwei weiteren Summanden bilden, die größer als Null sind. Und beim Würfeln sollte dann auch keine Null herauskommen.

Wenn man also nur positive ganze Zahlen (|N+) zulässt, wird's ein klein wenig komplizierter:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl
use strict;
use warnings;

my $maximum = 100; # Die Summe, die am Ende herauskommen muss
my $n = int(rand 9) + 2; # Gewuenschte Anzahl der Summanden, hier mal zufaellig zwischen 2 und 10
print "$n Summanden\n";

my @summanden;
my $summe = 0; # Bisher erreichte Summe
for my $summand (0 .. $n-1) {
if ($summand < $n-1) {
# Maximum fuer $summand'tes Glied ist $maximum-$summe,
# minus Anzahl der noch uebrigen Summanden!
push @summanden, int(rand ($maximum - $summe - ($n-$summand)) + 1);
} else {
# Letztes Glied ist der Rest
push @summanden, ($maximum - $summe);
}
$summe += $summanden[-1];
}

{
$, = ' + ';
print "@summanden = $summe\n";
}
styx-cc
 2008-05-11 04:15
#109554 #109554
User since
2006-05-20
533 articles
BenutzerIn

user image
Dann ist das ganze immer noch effektiver als das was ihr hier vorgeschlagen habt:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl  -w
use strict;

my ($nr1, $nr2, $nr3);
my @passes;

for (1..1_000_000) {
        #print $_ .": \n";
        $nr1 = int ( rand(100) );
        my $i = 0;
        do {
          $nr2 = int ( rand(100) );
          $i++;
        } while($nr1+$nr2 > 99);

        $nr3 = 100-($nr1+$nr2);
        #print "Durchlaeufe: ". $i ."\n";
        push @passes, $i;
        #print "$nr1 + $nr2 + $nr3 = " . ($nr1+$nr2+$nr3) ."\n";
}

my $average;
$average += $_ for @passes;
$average /= scalar @passes; 

print "\nDurchschnittl. Anzahl d. Durchlaeufe: " .$average;


Ausgabe (mehrmals ausgefuehrt):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
Durchschnittl. Anzahl d. Durchlaeufe: 5.164434
C:\programmierung\perl>perl 100.txt

Durchschnittl. Anzahl d. Durchlaeufe: 5.165607
C:\programmierung\perl>perl 100.txt

Durchschnittl. Anzahl d. Durchlaeufe: 5.208451
C:\programmierung\perl>perl 100.txt

Durchschnittl. Anzahl d. Durchlaeufe: 5.158104
C:\programmierung\perl>perl 100.txt

Durchschnittl. Anzahl d. Durchlaeufe: 5.194556
Pörl.
styx-cc
 2008-05-11 04:19
#109555 #109555
User since
2006-05-20
533 articles
BenutzerIn

user image
Und wenn man sich das ganze einfach machen moechte:

Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl  -w
use strict;

my $nr1 = int ( rand(100) );
my $nr2 = int (rand (100-$nr1));
my $nr3 = 100-($nr1+$nr2);

print "$nr1 + $nr2 + $nr3 = " . ($nr1+$nr2+$nr3) ."\n";


*g*

EDIT:
Argh, anstatt auf N hab ich mich auf 3 Zahlen festgelegt..
Berichtigt:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl  -w
use strict;

my $counts = 6;
my @numbers;

for my $i (0..$counts-2) {
        if ($i == 0) {
          $numbers[$i] = int(rand(100));
        } else {
      my $subtotal = 0;
          $subtotal += $_ for @numbers;
          $numbers[$i] = int(rand(100-$subtotal));
        }
}

my $amount = 0;
print join('+', @numbers) .'+';
$amount += $_ for @numbers;

my $last_nr = (100-$amount);
print "$last_nr = ";
print $amount+$last_nr;
Pörl.
KurtZ
 2008-05-11 06:34
#109557 #109557
User since
2007-12-13
411 articles
BenutzerIn
[default_avatar]
Dubu+2008-05-11 02:13:46--
Wenn man also nur positive ganze Zahlen (|N+) zulässt, wird's ein klein wenig komplizierter:


Richtig, bei meiner Methode wirds nur ein klein wenig komplizierter, man darf halt nicht zwo gleiche Zwischensummen zulassen, sondern muss dann eben nochmal würfeln.

Was ihr bei euren Rest-Methoden alle überseht ist, dass egal wie lang die Sequenzen sind, immer mehr als die Hälfte aller Sequenzen ein Intervall enthält das größer als die Hälfte ist.
Dann nochmal die Hälfte mit ner Sequenz größer als ein Viertel, usw.

Ich kann mir nicht vorstellen dass man sowas will, dass ist ziemlich langweilig und unrepresentativ und außerdem hat man dann bei längeren Sequenzen oft lauter Nullen (oder Einsen je nach dem).

Zur Veranschaulichung den Algo von Gast für 5er-Sequenzen genommen und die ersten 20 Ergebnisse ausgegeben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
94 5 0 0 1
64 6 17 1 12
36 21 1 19 23
29 38 17 4 12
83 6 1 1 9
71 25 0 3 1
95 1 3 0 1
84 15 0 0 1
91 5 3 0 1
29 25 43 2 1
62 9 8 1 20
93 0 2 3 2
46 11 1 12 30
18 37 9 31 5
68 9 13 8 2
15 29 25 15 16
66 8 25 0 1
96 3 0 0 1
46 47 4 0 3
75 5 10 4 6


bitte vergleichen mit
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0	8	15	25	52
7 13 7 4 69
11 16 21 13 39
15 8 23 5 49
41 14 38 6 1
22 19 37 13 9
4 75 5 2 14
2 10 8 5 75
1 24 9 52 14
17 24 28 17 14
7 68 15 3 7
19 15 30 20 16
4 0 7 78 11
16 25 5 52 2
12 40 14 2 32
23 4 17 27 29
16 1 30 46 7
3 29 36 25 7
22 34 21 2 21
12 39 42 3 4


ermittelt mit
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use strict;
use warnings;

($\,$,)=("\n","\t");
my ( $min, $max, $anz ) =
   (    0,  100,    5 );

my $gt0=0; # Flag: groesser als 0

for (1..20) { # 20 Durchlufe
        my @zws=($min);
        my @seq;
        for (1..$anz-1) {
                my $zws=int(rand($max));
                redo if $gt0 and grep {/^$zws$/} @zws; # Null ausschließen [edit]regex mit ^...$ verbessert[/edit] 
                push @zws, $zws;
        }
        push @zws, $max; # letzte Zw-Summe == Gesamtsumme
        
        @zws=sort {$a <=> $b}  @zws;

        for my $i (1 .. $#zws) {
                push @seq, $zws[$i]-$zws[$i-1];
        }
        print @seq;
}
TMTOWTDYOG (there's more than one way to dig your own grave)
Dubu
 2008-05-11 12:30
#109562 #109562
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
@KurtZ: Deine Lösung gefällt mir. Und sie entspricht wegen der besseren Verteilung wahrscheinlich eher der Aufgabenstellung.
topeg
 2008-05-11 13:27
#109564 #109564
User since
2006-07-10
2611 articles
BenutzerIn

user image
Eine ganz kurze Lösung:
Code (perl): (dl )
1
2
3
4
5
6
7
my $bis=100;
my $menge=3;

my @zahlen=map{$_=1}(1..$bis);
$zahlen[int(rand($#zahlen))]+=pop(@zahlen) while(@zahlen>$menge);

print "@zahlen \n";

Leider hat sie einen Schönheitsfehler: Die '0' kommt niemals vor.
RPerl
 2008-05-11 14:04
#109567 #109567
User since
2006-11-26
384 articles
BenutzerIn

user image
Ein wirklich interessanter Thread ist das geworden! :-)

Quote
>Naja ... Mathe könnt ich verzeihen aber Deutsch hättest du üben sollen ; )

Einmal sind solche Saetze ja lustig, kein zweites mal.
Im richtigen Leben wuerdest du das ja schliesslich auch nicht sagen.
Community = *click*

Bei allen anderen moechte ich mich herzlich bedanken.
Ich hab topeg's Loesung genommen, die ist kurz, performant und absolut ausreichend. Danke!
KurtZ
 2008-05-11 15:59
#109572 #109572
User since
2007-12-13
411 articles
BenutzerIn
[default_avatar]
RPerl+2008-05-11 12:04:49--
Im richtigen Leben wuerdest du das ja schliesslich auch nicht sagen.


Doch, natürlich!

Insbesondere bei Leuten die sich erst helfen lassen und danach sagen sie hätten es aber anders gemeint als sie gesagt haben.

(Zugegeben mein Fankreis ist ... kontrastiert ;-)
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 3 4 5 >| >> 45 entries, 5 pages



View all threads created 2008-05-10 23:36.