|< 1 2 >| | 12 Einträge, 2 Seiten |
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 28 29 30 31 32 33 34
#!/usr/bin/perl use strict; use warnings; my $init_popsize=$ARGV[0]-1; my $maxtime=$ARGV[1]; my @age; my @gender; my @weight; my @population = (0..$init_popsize); for my $i(0..$#population){ $age[$i]=int(rand(10)); #Alter my $r1=rand(); if($r1<=0.4){ #Geschlecht (0=männlich, 1=weiblich) $gender[$i]=0; } else{ $gender[$i]=1; } my $r2=rand(); if ($r2<=0.3){ #Gewicht $weight[$i]=0; } elsif ($r2>0.3 && $r2<=0.6){ $weight[$i]=1; } else{ $weight[$i]=2; } printf "$age[$i] $gender[$i] $weight[$i]\n"; } printf "\n";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
for my $t (1..$maxtime){ Innen: for my $i (0..$#population){ $age[$i]++; if ($age[$i]>=10){ splice (@age, $i, 1); splice (@weight, $i, 1); splice (@gender, $i, 1); splice (@population, $i, 1); # $age[$i]++; next Innen; } } for my $i (0..$#population){ printf "$age[$i] $gender[$i] $weight[$i]\n"; } my $population=$#population+1; printf "\npopulation: $population\n"; }
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#!/usr/bin/perl use strict; use warnings; #USAGE: ./alvin.pl 6 3 my $init_popsize = $ARGV[0] - 1; my $maxtime = $ARGV[1]; my @age; my @gender; my @weight; my @population = ( 0 .. $init_popsize ); for my $i ( 0 .. $#population ) { $age[$i] = int( rand(10) ); #Alter my $r1 = rand(); if ( $r1 <= 0.4 ) { #Geschlecht (0=männlich, 1=weiblich) $gender[$i] = 0; } else { $gender[$i] = 1; } my $r2 = rand(); if ( $r2 <= 0.3 ) { #Gewicht $weight[$i] = 0; } elsif ( $r2 > 0.3 && $r2 <= 0.6 ) { $weight[$i] = 1; } else { $weight[$i] = 2; } printf "$age[$i] $gender[$i] $weight[$i]\n"; } printf "\n"; Aussen: for my $t ( 1 .. $maxtime ) { Innen: for my $i ( 0 .. $#population ) { $age[$i]++; if ( $age[$i] >= 10 ) { splice( @age, $i, 1 ); splice( @weight, $i, 1 ); splice( @gender, $i, 1 ); splice( @population, $i, 1 ); # $age[$i]++; next Innen; } } for my $i ( 0 .. $#population ) { printf "$age[$i] $gender[$i] $weight[$i]\n"; } my $population = $#population + 1; printf "\npopulation: $population\n"; }
Alvin+2008-01-12 16:22:14--[...] die 9 ist weg, wie gewünscht, die 4,5,7 und die letzte 7 wurden um 1 erhöht, aber die 1 wurde nicht erhöht. Warum???
Hab schon dran gedacht nach den splice Befehlen i-- zu machen, aber bringt auch nix.
[...]
1 2 3 4 5 6 7 8 9
... Innen: for (my $i = $[; $i <= $#population; $i++) { ... if (...) { ... splices ... $i-- } } ...
Linuxer+2008-01-12 17:42:27--[...]
Wenn Du keine Formatierung der Ausgabe machst, dann nimm print;
wenn Du was formatieren willst, dann printf.
Denn ansonsten ist das eher eine Kanone für den Spatz.
[...]
printf 'Das ist ein String: %s', $irgendwas;
print "Das ist ein String: $irgendwas";
printf "Das ist ein String: $irgendwas";
Innen: for my $i (reverse( 0 .. $#population)) {
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/perl
use strict;
use warnings;
#USAGE: ./alvin.pl 6 3
# die Ausgabe in einer eigenen Funktion
# dann schreibt man es nicht unnötig doppelt.
sub show_person
{
my $person=shift(@_);
my $age=$person->{age}; # Wert aus einer Hashreferenz lesen.
my $gender=$person->{gender};
my $weight=$person->{weight};
print "$age\t$gender\t$weight\n";
}
# $wert=(<bedingung>)?$a:$b ist gleich zu if(<bedingung>){$wert=$a}else{$wert=$b}
my $init_popsize = $ARGV[0] ? $ARGV[0] - 1 : 10 ; # wenn keine Angabe dann 10 annehmen
my $maxtime = $ARGV[1] ? $ARGV[1] : 10; # wenn keine angabe dann 10 Durchläufe machen
my @population;
for my $i (0..$init_popsize)
{
my $age=int( rand(10) );
my $gender=1; #Geschlecht (0=männlich, 1=weiblich)
$gender=0 if( rand(1) <= 0.4); # einen if-Zweig gespart.
my $random=rand(1);
my $weight=2;
if ( $random <= 0.3 )
{ $weight=0; }
elsif ( $random > 0.3 && $random <= 0.6 )
{ $weight=1; }
my %person=(age=>$age, gender=>$gender, weight=>$weight); # ein Hash der alle werte enthält
push(@population,\%person); # Referenz auf den Hash ans Array anhängen
show_person(\%person);
}
print "\n";
Aussen: for my $t ( 1 .. $maxtime )
{
print "\nTIME: $t\n";
Innen: for my $i (reverse( 0 .. $#population ))
{
my $person=$population[$i]; # referenz aus dem Array lesen
$person->{age}++;
splice( @population, $i, 1 ) if($person->{age} >= 10);
}
for my $person (@population) # hier kann man das array so durchlaufen lassen
{ show_person($person); }
print "population: ".@population."\n"; # im Skalarkontext gibt @array die Anzahl der enhaltenen Elemente zurück.
}
1 2
my $init_popsize = defined $ARGV[0] ? $ARGV[0] - 1 : 10 ; # wenn keine Angabe dann 10 annehmen my $maxtime = defined $ARGV[1] ? $ARGV[1] : 10; # wenn keine angabe dann 10 Durchläufe machen
Linuxer+2008-01-13 18:46:06--es kann sein, dass, wenn kein Argumente mitgegeben wurden, Perl meckert, weil $ARGV[0] und $ARGV[1] (generell @ARGV) uninitialisiert sein dürfte. Das kannst Du so abfangen:
Code (perl): (dl )1 2my $init_popsize = defined $ARGV[0] ? $ARGV[0] - 1 : 10 ; # wenn keine Angabe dann 10 annehmen my $maxtime = defined $ARGV[1] ? $ARGV[1] : 10; # wenn keine angabe dann 10 Durchläufe machen
1 2
my $init_popsize = shift @ARGV || 10 ; # wenn keine Angabe dann 10 annehmen my $maxtime = shift @ARGV || 10; # wenn keine angabe dann 10 Durchläufe machen
renee+2008-01-14 11:47:53--@Linuxer: dann wird aber nicht auf definiertheit überprüft. Bei Dir würde eine "0" in $ARGV[0] durch eine "10" ersetzt werden...
my $foo = shift @array // 10;
|< 1 2 >| | 12 Einträge, 2 Seiten |