Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7268[/thread]

Zufällige Ausgabe

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
havi
 2005-09-12 12:05
#57827 #57827
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Hallo Leute!

Ich hab eine Datei mit 60.000 Zeilen (Nummern).

Nun muß ich 700 Nummern in eine neue Datei schreiben und
zwar nach Zufallsprinzip.
Das heißt es sollten möglichst keine fortlaufenden Nummern
sein.

Lg
esskar
 2005-09-12 12:14
#57828 #57828
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my $max = 700;
my %seen = ();
my $run = 1;
while($run) {
my $lncount = 0;
  while(<IN>) {  
     my $r = int(rand(2));
     if($r == 0 and not exists $seen{$lncount}) {
        print OUT $_;
        $seen{$lncount} = 1;
        --$max;
        if($max == 0) {
            $run = 0;
            last;
        }        
     }
     ++$lncount;
  }
  seek(IN, 0, 0) if $run;
}


ungetestet\n\n

<!--EDIT|esskar|1126513011-->
havi
 2005-09-12 12:18
#57829 #57829
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Gibt die Zahlen 1 bis 700 aus...
havi
 2005-09-12 12:33
#57830 #57830
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
habs schon...

my $r = int(rand(1)); # 1 mit z.B. 123 austauschen!

Danke.

Gruss
renee
 2005-09-12 12:33
#57831 #57831
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
700 selbst erzeugte Nummern
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;

my %hash = ();
my $max = 60_000;
my $count = 700;

while(keys(%hash) < $count-1){
$hash{int rand($max)} = 1;
}

print scalar(keys(%hash));
print $_,"\n" for(keys(%hash));


700 Nummern aus der Datei:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;

my %hash = ();
my $file = '/path/to/file.txt';
my $count = 700;

tie my @array,'Tie::File',$file or die $!;
while(keys(%hash) < $count-1){
$hash{$array[int rand(scalar(@array)-1)]} = 1;
}
untie @array;

print scalar(keys(%hash));
print $_,"\n" for(keys(%hash));
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
havi
 2005-09-12 12:42
#57832 #57832
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
[quote=esskar,12.09.2005, 10:14]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my $max = 700;
my %seen = ();
my $run = 1;
while($run) {
  my $lncount = 0;
  while(<IN>) {  
     my $r = int(rand(2));
     if($r == 0 and not exists $seen{$lncount}) {
        print OUT $_;
        $seen{$lncount} = 1;
        --$max;
        if($max == 0) {
            $run = 0;
            last;
        }        
     }
     ++$lncount;
  }
  seek(IN, 0, 0) if $run;
}


ungetestet[/quote]
Na jetzt funktioniert es irgendwie gar nicht mehr bzw. sehr sehr langsam!
havi
 2005-09-12 12:46
#57833 #57833
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
langsam wird es durch
my $r = int(rand(2));
wobei ich die Zahl 2 auf 123 ausgebessert habe, sonst
liegen die Nummern zu nah zusammen.
esskar
 2005-09-12 12:47
#57834 #57834
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmm; das sollte doch ne zahl zwischen 0 und 1 erzeugen, oder?
esskar
 2005-09-12 12:48
#57835 #57835
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
mach mal so
Code: (dl )
1
2
my $r = rand(1);
if($r < 0.5 and not exists $seen{$lncount}) {
havi
 2005-09-12 13:01
#57836 #57836
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Irgendwie funktioniert das alles nicht richtig!

Die erste Version war noch am besten...
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-09-12 12:05.