The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Data::Lotter - Data pickup module by its own weight

SYNOPSIS

  use Data::Lotter;

  # 抽選候補データを用意
  #  item => weight のhash
  my %candidates = (
    red    => 10,
    green  => 10,
    blue   => 10,
    yellow => 10,
    white  => 10, 
  );

  # データをセット
  my $lotter = Data::Lotter->new(%candidates);

  # 普通のpickup
  # 3つのアイテムを抽選(47個のアイテムwaitが残る)
  my @ret = $lotter->pickup(3);
  # ex. ( red, green, yellow ) = @ret

  # REMOVEオプションつきのpickup
  # 1つのアイテムを抽選(4つのアイテムが残る)
  my @ret = $lotter->pickup(1, "REMOVE");

DESCRIPTION

Data::Lotter is データ抽選モジュールです。 itemとweightの値を持ったhashを「抽選候補データ」として準備します。 (weightは適当にばらけた数値を指定して構いません)

        red       green      blue       yellow      white
     ---------- ---------- ---------- ---------- ----------
     0123456789 0123456789 0123456789 0123456789 0123456789

ここから1つのデータを抽選するとします。 たとえば「35」が抽選の結果だったとします。

        red       green      blue       yellow      white
     ---------- ---------- ---------- ---------- ----------
     0123456789 0123456789 0123456789 0123456789 0123456789
                                          ^
                                          ↑ここ

抽選用のpickupメソッドが呼び出された後、データは以下のように抽選されたitemのweightが1つ減らされた状態になります。

        red       green      blue       yellow     white
     ---------- ---------- ---------- --------- ----------
     0123456789 0123456789 0123456789 012356789 0123456789
                                          ^
                                          ↑ここが消えた

REMOVEオプションをつけてpickupメソッドを呼び出すと、その番号を保有するitemごと削除されます。

        red       green      blue        white
     ---------- ---------- ---------- ----------
     0123456789 0123456789 0123456789 0123456789

                                         yellowごと消えた!

これにより複数の候補から複数のアイテムを繰り返し抽選する際に、 * 福引のように「たくさんのくじの中から選ぶ」パターンと * 選挙のように「特定の誰かを何人か決める」ようなパターンの両方を実現できます。

METHODS

new()

pickup()

left_items()

left_item_waits()

AUTHOR

Takeshi Miki <miki@cpan.org>

Original idea was spawned by KANEGON

Special thanks to Daisuke Maki

LICENSE

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO