Thread Array mischen über Schwartz'sche Transformation (7 answers)
Opened by rosti at 2024-11-27 10:28

rosti
 2024-11-28 15:57
#196740 #196740
User since
2011-03-19
3476 Artikel
BenutzerIn
[Homepage]
user image
Hier eine Lösung für das Mischen über den Index. Beim mehrmaligen Mischen entstehen so auch andere Reihenfolgen.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);

my @li  = ('a'..'z','a');

shuffle(\@li) for 1..5;
print "@li\n";

sub shuffle{
    my $ref = shift;
    my @idx = 0 .. scalar @$ref -1;
    @$ref = 
        map{ $ref->[$_->[0]] }
        sort{ $a->[1] cmp $b->[1] }
        map{ [ $_, md5_hex($_.$$.time) ] }@idx;
}


Edit: Der Index in einem Array ist numerisch. Von daher können wir crypt() verwenden wenn diese Zahlen auf 8 Byte eingedampft werden und das geht mit pack("V",NUM) (little Endian!).

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use strict;
use warnings;

my @li  = ('a'..'z','a');
shuffle(\@li) for 1..3;

sub shuffle{
    my $ref = shift;
    my @idx = 0 .. scalar @$ref -1;
    @$ref = 
        map{ $ref->[$_->[0]] }
        sort{ $a->[1] cmp $b->[1] }
        map{ [ $_, crypt(pack("V",$_),$$) ] }@idx;

    print "@$ref\n";
}

Last edited: 2024-11-28 18:08:13 +0100 (CET)

View full thread Array mischen über Schwartz'sche Transformation