Rand Stats

Data::RandomKeep

zef:lucs

Actions Status

NAME

Data::RandomKeep - Randomly keep a given number of offered items.

SYNOPSIS

use Data::RandomKeep;

    # Select numbers as a pick for a lottery ticket.
my $nums-keeper = Data::RandomKeep.new: 6;
$nums-keeper.offer: $_ + 1 for ^49;
say "This might win: {$nums-keeper.kept}";

    # Keep 10 random lines from a file.
my $file = FIXME;
my $lines-keeper = Data::RandomKeep.new: 10;
$lines-keeper.offer($_) for $file.IO.lines;
say $lines-keeper.kept.join: "\n";

DESCRIPTION

Suppose you want to keep ten random lines from a file whose number of lines you don't happen to know. You might read all the lines in an array, shuffle it, and keep the first ten lines, but that can be quite wasteful, especially if the file is big. This module implements the task more efficiently.

To use the module, you first instantiate a Data::RandomKeep object, telling the constructor how many items you will want to keep. Then you .offer it items, which the instance will keep or discard, with correct randomness. At any moment, you can look at the items that have been kept up to that point, using the .kept method.

.kept returns a list of the items kept so far. The items will be in the same order in which they were originally offered.

--------------------------------------------------------------------

AUTHOR

Luc St-Louis, lucs@pobox.com

COPYRIGHT AND LICENSE

Copyright (C) 2023 by Luc St-Louis

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.