in reply to Re^3: Creating a random generator
in thread Creating a random generator

I find a lookup table is the way to go for these situations.
#!/usr/bin/perl use strict; use warnings; my $beholder_default = 'beholder'; my $param = get_param(); my @keys = ( 'beholder', 'deathkiss', 'eye of the deep', 'gauth', 'spectator', 'undead', 'hive mother', 'director', 'examiner', 'lensman', 'watcher' ); my %lookup = ( 'beholder' => { book => 'Monstrous Manual', beholder => 'beholder', page => 21, }, 'death kiss' => { book => 'Monstrous Manual', beholder => 'beholder', page => 21, }, 'eye of the deep' => { book => 'Monstrous Manual', beholder => 'beholder', page => 21, }, 'gauth' => { book => 'Monstrous Manual', beholder => 'beholder', page => 21, }, 'spectator' => { book => 'Monstrous Manual', beholder => 'beholder', page => 21, }, 'undead' => { book => 'Monstrous Manual', beholder => 'beholder', page => 21, }, 'hive mother' => { book => 'Monstrous Manual', beholder => 'beholder', page => 21, }, 'director' => { book => 'Monstrous Manual', beholder => 'beholder', page => 21, }, 'examiner' => { book => 'Monstrous Manual', beholder => 'beholder', page => 21, }, 'lensman' => { book => 'Monstrous Manual', beholder => 'beholder', page => 25, }, 'overseer' => { book => 'Monstrous Manual', beholder => 'beholder', page => 25, }, 'watcher' => { book => 'Monstrous Manual', beholder => 'beholder', page => 25, }, ); my $key; if ($param){ $key = $beholder_default; } else{ $key = $keys[rand @keys]; } my $beholder = $lookup{$key}{beholder}; my $book = $lookup{$key}{book}; my $page = $lookup{$key}{page}; print "beholder: $beholder\n"; print "book: $book\n"; print "page: $page\n"; sub get_param { # get your input from somewhere my $param = undef; return $param; }
Ah, I didn't see your update before I posted this.

Replies are listed 'Best First'.
Re^5: Creating a random generator
by Lady_Aleena (Priest) on Sep 08, 2007 at 11:09 UTC

    To give you all an idea of what the output is to look like, here is each item of the array.

    • beholder (Monstrous Manual, pg 21)
    • death kiss beholder (Monstrous Manual, pg 21)
    • eye of the deep beholder (Monstrous Manual, pg 21)
    • gauth beholder (Monstrous Manual, pg 21)
    • spectator beholder (Monstrous Manual, pg 21)
    • undead beholder (Monstrous Manual, pg 21)
    • hive mother beholder (Monstrous Manual, pg 25)
    • director beholder (Monstrous Manual, pg 25)
    • examiner beholder (Monstrous Manual, pg 25)
    • lensman beholder (Monstrous Manual, pg 25)
    • overseer beholder (Monstrous Manual, pg 25)
    • watcher beholder (Monstrous Manual, pg 25)
      I've reduce the size of the table for brevity.

      #!/usr/bin/perl use strict; use warnings; my $beholder_default = 'beholder'; my $param = get_param(); my %monster_lookup = ( 'beholder' => { book => 'Monstrous Manual', beholder => 1, page => 21, }, 'death kiss' => { book => 'Monstrous Manual', beholder => 0, page => 21, }, ); # this saves duplicating data in your code my @monsters = keys %monster_lookup; my $monster; if ($param){ $monster = $beholder_default; } else{ my $rand = int rand @monsters; $monster = $monsters[$rand]; } my $book = $monster_lookup{$monster}{book}; my $page = $monster_lookup{$monster}{page}; my $beholder = $monster_lookup{$monster}{beholder}; if (not $beholder){ print "$monster "; } print "beholder ($book, pg $page)\n"; sub get_param { # get your input from somewhere my $param = 0; return $param; }
        Here is the hash as I would like it with the "default" book as a scalar, and used in the hash. I hope that works.
        my $MM = "Monstrous Manual" my %monster_lookup = ( 'beholder' => { book => $MM, beholder => 1, page => 21, }, 'death kiss' => { book => $MM, beholder => 0, page => 21, }, 'eye of the deep' => { book => $MM, beholder => 0, page => 21, }, 'gauth' => { book => $MM, beholder => 0, page => 21, }, 'spectator' => { book => $MM, beholder => 0, page => 21, }, 'undead' => { book => $MM, beholder => 0, page => 21, }, 'hive mother' => { book => $MM, beholder => 0, page => 25, }, 'director' => { book => $MM, beholder => 0, page => 25, }, 'examiner' => { book => $MM, beholder => 0, page => 25, }, 'lensman' => { book => $MM, beholder => 0, page => 25, }, 'overseer' => { book => $MM, beholder => 0, page => 25, }, 'watcher' => { book => $MM, beholder => 0, page => 25, }, );

        Would Perl be okay with the following?

        my $MM = "Monstrous Manual" my %monster_lookup = ( 'beholder' => {book => $MM,beholder => 1,page => 21,}, 'death kiss' => {book => $MM,beholder => 0,page => 21,}, 'eye of the deep' => {book => $MM,beholder => 0,page => 21,}, 'gauth' => {book => $MM,beholder => 0,page => 21,}, 'spectator' => {book => $MM,beholder => 0,page => 21,}, 'undead' => {book => $MM,beholder => 0,page => 21,}, 'hive mother' => {book => $MM,beholder => 0,page => 25,}, 'director' => {book => $MM,beholder => 0,page => 25,}, 'examiner' => {book => $MM,beholder => 0,page => 25,}, 'lensman' => {book => $MM,beholder => 0,page => 25,}, 'overseer' => {book => $MM,beholder => 0,page => 25,}, 'watcher' => {book => $MM,beholder => 0,page => 25,}, );

        What I really want with the book key is that if it is empty, then the default book, else what is in the book in the key.

        The argument between using package or lexical variables can continue at a later time.

        Corrections:

        • quoting
        • hash item without keys.
        • copy/paste errors

        Update

        • 2nd bit of code without the whitespace