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

My turn to go Aargh!!! I just wrote pretty much this same code and I missed the for (1..8) optimization.

Of course, I have an excuse since my code actually accepts the size for the password and if they go with a real large password, I would have to wait for the list to be created. Yeah, that's my excuse and I'm sticking to it. :-) Yes, I know it's a weak excuse, but it was the best I could come up with.

One question though. When using a random number it returns a decimal. Does using it as an array index automagically int() it? 'Cause in my code, I explicitly call int around my rand call.

Replies are listed 'Best First'.
RE: RE: (Ovid) Re: General quesion
by Ovid (Cardinal) on Aug 08, 2000 at 04:43 UTC
    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
      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

      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