Code Comments
Programming Forum and web based access to our favorite programming groups.Hi,
I want to generate 6 random numbers from 1 to 10.
The 6 numbers must not the same.
These numbers must match to the number of an array.
I like to know how many iterations to get the match.
I am having troubles with the do-until loop. Could someone point out the
problem for me?
#!/usr/bin/perl -w
# generate 6 random numbers (1~10) that match exactly to the @ticket
# count the number of loops
use strict;
srand(time||$$);
my @ticket = sort (2, 3, 5, 7, 8, 10);
my @all_number = ();
my @new_number = ();
my $count = 0;
# generate 10 numbers
for (my $i = 0; $i < 10; $i++) {
my $number = $i + 1;
push (@all_number, $number)
}
do {
#reset @new_number to the empty array each time through the loop.
@new_number = ();
#get 6 random numbers
for (my $i = 0; $i < 6; $i++) {
my $position = randomposition (@all_number);
# Pick a random number from @all_number
my $number = splice (@all_number, $position, 1);
push (@new_number, $number);
}
@new_number = sort (@new_number);
print "@new_number\n";
$count++;
} until (($new_number[0] eq "$ticket[0]") && ($new_number[1] eq
"$ticket[1]")
&& ($new_number[2] eq "$ticket[2]") && ($new_number[3] eq
"$ticket[3]")
&& ($new_number[4] eq "$ticket[4]") && ($new_number[5] eq
"$ticket[5]"));
print $count, "\n";
########################################
##################
sub randomposition {
my(@all_number) = @_;
# This expression returns a random number
return int(rand(scalar(@all_number)));
}
Post Follow-up to this messageIt may all become much simpler once the syntax is cleaned up and
simplified.
For example, you can reduce
> my @all_number = ();
...
> # generate 10 numbers
>
> for (my $i = 0; $i < 10; $i++) {
>
> my $number = $i + 1;
>
> push (@all_number, $number)
>
> }
to
my @all_number = (1..10);
and reduce
> #get 6 random numbers
>
> for (my $i = 0; $i < 6; $i++) {
>
> my $position = randomposition (@all_number);
>
> # Pick a random number from @all_number
>
> my $number = splice (@all_number, $position, 1);
>
> push (@new_number, $number);
>
> }
to
for (1..6) {
push @new_number, randomposition;
}
and
> sub randomposition {
>
> my(@all_number) = @_;
>
> # This expression returns a random number
>
> return int(rand(scalar(@all_number)));
>
> }
to
sub randomposition {
# return random number between 1 and 10;
return int(rand 10)+1;
}
But I still don't quite understand what you are trying to accomplish.
Do you want to count how many tries it takes to get a copy of an array
by generating random numbers? What for? The count you would get will be
random anyway. There are statistical functions for this sort of thing.
Or maybe I completely misunderstood your purpose.
Post Follow-up to this message
Show a Printable Version
Email This Page to Someone!
Receive updates to this thread
Powered by vBulletin
Copyright 2000-2006 Jelsoft Enterprises Limited.