Schrift
[thread]9096[/thread]

Probleme bei Zuallszahlen



<< >> 10 Einträge, 1 Seite
Gast Gast
 2007-06-17 23:20
#77597 #77597
Hallo erstmal;
ich möchte ein Programm schreiben, das ein Array mit Zufallszahlen füllt, und dann ausgibt wie oft jede Zahl vorkommt.Leider bekomm ichs nicht hin, die Zahlen durchzuzählen,
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
27
#!/usr/bin/perl -w
use strict;
my($v,@array, $i, %assarray, $index);
srand;
$v=0;
while ($v++ < 10)
{
 @array =  split (" ",rand(100));
 printf("%d %d\n", $v, @array);

}
for ($i=0;$i <= $#array;$i++)
{
 if(!defined($assarray{$array[$i]}))
 {
   $assarray{$array[$i]} = 1;
 }
 else
 {
   $assarray{$array[$i]}++;
 }

}
foreach $index (keys %assarray)
{
 printf ("%d %d %d\n",$index, $assarray{$index}, length($index));
}


Das gibt mein Programm aus, eigentlich sollte noch die Ausgabe der Anzahlen also bei 75 2 mit ausgegeben werden.
1 16
2 40
3 54
4 68
5 38
6 94
7 75
8 75
9 9
10 83
83 1 16
Wär echt net, wenn mir einer von euch eine Tipp geben könnte.
Danke schon mal, lg Maria
#Kein Kommentar
 2007-06-18 00:07
#77598 #77598
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
so funktionierts:

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
#!/usr/bin/perl -w

use strict;
my ($v,@array, $i, %assarray, $index);
srand;
$v=0;

while ($v++ < 10){
push (@array, int (rand (100)) + 1);
printf ("%d) %d\n", $v, @array);
}

foreach $i (0..$#array) {
$assarray{"$i"}++;
}

print "Anzahl der Zahlen:\n";
print "-" x 60;
print "\n";

foreach $index (keys %assarray){
printf "%d %d %d\n", $index, $assarray{$index}, length($index);
}


die wesentliche änderung war:

Code: (dl )
@array =  split (" ",rand(100));


in

Code: (dl )
push (@array, int (rand (100)) + 1);


umzuwandeln
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
styx-cc
 2007-06-18 01:46
#77599 #77599
User since
2006-05-20
533 Artikel
BenutzerIn

user image
So sollte es funktionieren:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl -w
use strict;

my @zufallszahlen;
#zufallszahlen hinzufügen
for (0..9) {
push @zufallszahlen, int(rand(101));
#print $_+1 .") $zufallszahlen[$_]\n";
}
print "-"x30 ."\n";

#zahlen abgleichen und ausgeben
for my $curr (@zufallszahlen) {
my $i = 0;
for(@zufallszahlen) {
$i++ if ($curr == $_);
}
print "$curr kommt $i mal vor.\n";
}

#kein kommentar:
dein code gibt bei mir komische sachen aus

MfG\n\n

<!--EDIT|styx-cc|1182116995-->
Pörl.
Ronnie
 2007-06-18 02:02
#77600 #77600
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
spricht irgendwas dagegen direkt einen Hash zu verwenden?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

use strict;
use warnings;

my $times = 20;
my $max = 10;
my %histogram = ();

$histogram{ int(rand($max))+1 }++ for 0..$times;
print $_ . ": " . $histogram{$_} . "\n" for sort keys %histogram;
styx-cc
 2007-06-18 02:12
#77601 #77601
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Nee, im Gegenteil =)
Dachte nur das man es vielleicht einfach hält, damit die Threaderoeffnerin das gut nachvollziehen kann..

Aber dein Code gibt mir auch komische Sachen aus:
Code: (dl )
1
2
3
4
5
6
7
8
1: 4
10: 2
3: 2
4: 1
5: 2
7: 1
8: 2
9: 7
Pörl.
Linuxer
 2007-06-18 02:18
#77602 #77602
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Hm, es mag an der späten Stunde liegen, doch was ist an der ausgabe komisch? Kannst Du das "komisch" bitte näher erläutern?

Das Ergebnis passt doch...
Der erste Wert ist eine Zufallszahl zwischen 1 und 10; pro Zahl wird dann die Anzahl ausgegeben, wie oft diese Zufallszahl erzeugt worden ist.
Die Summe aller Anzahlen ergibt 21 (was auch korrekt ist bei einem Durchlauf von 0 bis 20)...

Wo ist das "komisch"?
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Ronnie
 2007-06-18 02:19
#77603 #77603
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=styx-cc,18.06.2007, 00:12]Aber dein Code gibt mir auch komische Sachen aus:[/quote]
Sortiert halt nach ASCII, ist leicht zu ändern:
Code: (dl )
print $_ . ": ". $histogram{$_} ."\n" for sort { $a <=> $b } keys %histogram;
styx-cc
 2007-06-18 02:22
#77604 #77604
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Oh..., bin von 10 durchlaeufen ausgegangen, werd das naechste mal besser hinschauen *duck

MfG
Pörl.
Linuxer
 2007-06-18 02:24
#77605 #77605
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Was mir noch einfiel:

Wenn man direkt einen Hash befüllt, verliert man natürlich die Zufälligkeit der Zufallszahlen .... sprich, es ist nachher nicht nachzuvollziehen, wann welche Zahl "gefallen" ist.
Wenn das benötigt ist, sollte ein Array gefüllt werden....
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Ronnie
 2007-06-18 02:31
#77606 #77606
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=Linuxer,18.06.2007, 00:24]Wenn das benötigt ist, sollte ein Array gefüllt werden....[/quote]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

use strict;
use warnings;

my $times = 20;
my $max = 10;
my %histogram = ();
my @randoms = ();

@randoms = map { int(rand($max))+1 } 0 .. $times;
$histogram{ $_ }++ for @randoms;
print $_ . ": ". $histogram{$_} ."\n" for sort { $a <=> $b } keys %histogram;

Ist nur 'ne winzige Änderung, dann hat man das Ganze auch noch in 'nem Array - ist aber eh die Frage für was es insgesamt gut sein soll?
<< >> 10 Einträge, 1 Seite



View all threads created 2007-06-17 23:20.