--- loncom/homework/radiobuttonresponse.pm 2001/01/12 01:07:13 1.5 +++ loncom/homework/radiobuttonresponse.pm 2001/01/12 15:32:29 1.6 @@ -26,6 +26,7 @@ sub end_radiobuttonresponse { %Apache::response::foilgroup={}; sub start_foilgroup { %Apache::response::foilgroup={}; + return ''; } sub setrandomnumber { @@ -44,10 +45,12 @@ sub end_foilgroup { my $name; my $result; &setrandomnumber(); - my $rrargs =''; - if ( $#$parstack > 0 ) { $rrargs=$$parstack['-2']; } - my $max = &Apache::run::run("{$rrargs;".'return $max}',$safeeval); - my $answer = int(rand $max); + my ($truecnt,$falsecnt,$max) = &getfoilcounts($parstack,$safeeval); + my $count=0; + # we will add in 1 of the true statements + if (($falsecnt+1)>$max) { $count=$max } else { $count=$falsecnt+1; } + my $answer = int(rand ($count)); + &Apache::lonxml::debug("Answer is $answer, $count from $max, $falsecnt"); if ($target eq 'web') { $result=&displayfoils($max,$answer); } elsif ( $target eq 'grade') { @@ -68,6 +71,26 @@ sub end_foilgroup { return $result; } +sub getfoilcounts { + my ($parstack,$safeeval)=@_; + my $rrargs =''; + if ( $#$parstack > 0 ) { $rrargs=$$parstack['-2']; } + my $max = &Apache::run::run("{$rrargs;".'return $max}',$safeeval); + my @names = @{ $Apache::response::foilgroup{'names'} }; + my $truecnt=0; + my $falsecnt=0; + my $name; + + foreach $name (@names) { + if ($Apache::response::foilgroup{$name.'.value'} eq 'true') { + $truecnt++; + } elsif ($Apache::response::foilgroup{$name.'.value'} eq 'false') { + $falsecnt++; + } + } + return ($truecnt,$falsecnt,$max); +} + sub displayfoils { my ($max,$answer)=@_; my @names = @{ $Apache::response::foilgroup{'names'} };