in reply to RE: (Ovid) Re: General quesion
in thread General quesion

When using a random number it returns a decimal. Does using it as an array index automagically int() it?

Take a look at the scalar we're creating:

$myarray[rand(@myarray)];
You'll notice that rand is being passed @myarray. Since rand is expecting a scalar, @myarray is interpreted in a scalar context. Therefore, it returns the length of the array (52 in this case), which will cause rand to generate a random number from 0 to 51, which fits the array index quite nicely. Perhaps this would have been more clear:
$myarray[rand($#myarray)];
Cheers,
Ovid

Replies are listed 'Best First'.
RE: RE: RE: (Ovid) Re: General quesion
by merlyn (Sage) on Aug 08, 2000 at 06:36 UTC
    But rand($#myarray) returns 0..50 not 0..51. $#array in a scalar context is always one less than @array in a scalar context.

    So, the idiom is:

    $random_item = $array[rand @array];

    Just cut-n-paste that!

    -- Randal L. Schwartz, Perl hacker

RE: RE: RE: (Ovid) Re: General quesion
by johannz (Hermit) on Aug 08, 2000 at 22:35 UTC

    My question wasn't clear. I know that rand() returns a number between 0 and it's argument. But my point was, it returns a decimal; i.e. 3.14159, 25.70098, .00001, etc. Does perl automatically round the number down(or take the integer portion)? For eaxample, here is my code:

    my $lRandomPassword = ''; my $lMaxLength = 10; my $length; my $lRand; my @lKeySpace = ('A'..'Z', 'a..z', 0..9); my $lKeySpaceSize = scalar(@lKeySpace); for ($length = 0; $length < $lMaxLength; $length++) { $lRand = int(rand($lKeySpaceSize)); $lRandomPassword .= $lKeySpace[$lRand]; }; $lRandomPassword;

    Yes, I know the code is overly verbose, but the important question for me is, could I safely get rid of the int() call? Does perl take the integer portion of an array index?

      Yes it does automatically takethe integer portion when using it for an array index. Using int() you will also simply get the integer portion, not a rounded number, so you using the int() is sort of a noop. To round, you could do this:

      my $foo = sprintf "%.0f", rand(100);
      But, to illustrate the answer to your question:

      perl -wle '@r = (1,2,3); print $r[$t = rand(3)]; print "$t"'; 2 1.28954588016495

      Cheers,
      KM

        Hmm. I'm not sure what you mean but I think you have made an incorrect assumption. Perl's int() just rounds down. It does not (necessarilly) convert the number into a long or unsigned long. You might want to read my previous node on Perl and floating point.

                - tye (but my friends call me "Tye")