http://www.perlmonks.org?node_id=167761


in reply to Re: Bingo Challenge
in thread Bingo Challenge

You could speed things by shuffling @words right before the two inner loops.

foreach my $i (1..$cards) { my %seen; . . . for my $x (1..4) { for my $y (1..4) { my $word; while (1) { my $index = rand(@words); $word = $words[$index]; if (!$seen{$word}) { $seen{$word}++; last; } } . . .
becomes:
use Algorithm::Numerical::Shuffle qw /shuffle/; . . . foreach my $i (1..$cards) { . . . @words = shuffle @words; for my $x (1..4) { for my $y (1..4) { my $word = shift @words; . . .

HTH,
Charles K. Clarkson
Clarkson Energy Homes, Inc.

Replies are listed 'Best First'.
Re: Re: Re: Bingo Challenge
by Matts (Deacon) on May 20, 2002 at 06:47 UTC
    Have you benchmarked that to see if it's faster?

    My suspicion would be that for large data sets it would be, but for smaller ones my naive rand() implementation would be quickest.

      Have you benchmarked that to see if it's faster?

      No, I used logic. (which is why I said it could be faster.) A shuffling algorithm takes the same time to shuffle on each pass. It's really just randomizing the array indexes. The idiom you were using varies each time through. The less words left, the longer it will take to produce an unchosen word. My thought was, perhaps you were unaware of shuffling or its application here.


      HTH,
      Charles K. Clarkson
      Clarkson Energy Homes, Inc.