Leser: 1
|< 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
@artikel=( [5,'Artikel1'], [10,'Artikel2'], [20,'Artikel3'] ); print auswahl(@artikel); sub auswahl{ my $g=0; $g+=$_->[0] for @_; my $zahl=rand $g; my $h=0; for(@_){ $h+=$_->[0]; return $_->[1] if $h>$zahl } }
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
#!/user/bin/perl -w use strict; my @artikel=([5,'Artikel1'],[10,'Artikel2'],[20,'Artikel3']); print auswahl(@artikel); sub auswahl{ my $prozent=0; my $h=0; foreach my $artikel (@_){ $prozent +=$artikel->[0]; } my $zahl= rand ($prozent); foreach my $artikel (@_){ $h+=$artikel->[0]; return $artikel->[1] if $h>$zahl } }
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
@elemente=Liste aller Elemente, ergänzt mit 0en auf 2^n Elemente;
$gesammtzahl=Aufsummierte wahrscheinlichkeiten;
{
my $schrankenbilden=0;
for(@elemente)
{
$schrankenbilden+=$_->[0];$_->[2]=$schrankenbilden
}
}
### Element auswählen
my $sprungvar=@elemente/2-1;
my $schritt=@elemente/4;
my $ziel=rand $gesammtzahl;
while($schritt>1){
if($elemente[$sprungvar]->[2]>$ziel)
{
$sprungvar-=$schritt;
}else{
$sprungvar+=$schritt;
}
$schritt/=2;
}
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
#!/usr/bin/perl use strict; use warnings; my @elemente=( [15,'Artikel1'], [10,'Artikel2'], [20,'Artikel3'], [80,'Artikel4'], [35,'Artikel5'], [10,'Artikel6'] ); # Array festgelegt { my $potenz=2; while($potenz<@elemente){$potenz*=2} my @leer_array=map {[0,'']} @elemente..$potenz-1; push @elemente,@leer_array; } # Array auf eine zweierpotenz gebracht my $gesammtzahl=0; for(@elemente) { $gesammtzahl+=$_->[0]; $_->[2]=$gesammtzahl } # Bei jedem Arrayelement steht jetzt dabei, wie groß die Summe # der Wahrscheinlichkeiten für alle vorhergehenden Elemente ist ### Element auswählen my $sprungvar=0; my $schritt=@elemente/2; my $ziel=rand $gesammtzahl; while($schritt>=1){ if($elemente[$sprungvar]->[2]<$ziel) { $sprungvar+=$schritt; }elsif($elemente[$sprungvar-1]->[2]>$ziel){ $sprungvar-=$schritt; }else{last}# Wenn man beim richtigen Element ist if($sprungvar<0){$sprungvar=0;last}# für den Fall, daß der # Zufallsgenerator auf das erste Element zeigt $schritt/=2; } print "$elemente[$sprungvar]->[1]\n";
|< 1 2 >| | 12 Einträge, 2 Seiten |