]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-12503 Loguniform and MDL-12421 rounding
authorpichetp <pichetp>
Tue, 11 Dec 2007 08:56:24 +0000 (08:56 +0000)
committerpichetp <pichetp>
Tue, 11 Dec 2007 08:56:24 +0000 (08:56 +0000)
question/type/calculated/questiontype.php
question/type/datasetdependent/datasetitems_form.php

index 5d70b6379438278e154a73de7ba12f2c4de27128..31e3a8738b906cb5b84467966ced46db8b5d57ca 100644 (file)
@@ -477,11 +477,11 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
     function custom_generator_tools_part(&$mform, $idx, $j){
 
         $minmaxgrp = array();
-        $minmaxgrp[] =& $mform->createElement('text', "calcmin[$idx]", get_string('calcmin', 'qtype_datasetdependent'), 'size="3"');
-        $minmaxgrp[] =& $mform->createElement('text', "calcmax[$idx]", get_string('calcmax', 'qtype_datasetdependent'), 'size="3"');
+        $minmaxgrp[] =& $mform->createElement('text', "calcmin[$idx]", get_string('calcmin', 'qtype_datasetdependent'));
+        $minmaxgrp[] =& $mform->createElement('text', "calcmax[$idx]", get_string('calcmax', 'qtype_datasetdependent'));
         $mform->addGroup($minmaxgrp, 'minmaxgrp', get_string('minmax', 'qtype_datasetdependent'), ' - ', false);
-        $mform->setType('calcmin', PARAM_NUMBER);
-        $mform->setType('calcmax', PARAM_NUMBER);
+        $mform->setType("calcmin[$idx]", PARAM_NUMBER);
+        $mform->setType("calcmax[$idx]", PARAM_NUMBER);
 
         $precisionoptions = range(0, 10);
         $mform->addElement('select', "calclength[$idx]", get_string('calclength', 'qtype_datasetdependent'), $precisionoptions);
@@ -709,63 +709,13 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
         }
         if ($regs[1] == 'uniform') {
             $nbr = $regs[2] + ($regs[3]-$regs[2])*mt_rand()/mt_getrandmax();
-            return round($nbr, $regs[4]);
+            return sprintf("%.".$regs[4]."f",$nbr);
 
         } else if ($regs[1] == 'loguniform') {
             $log0 = log(abs($regs[2])); // It would have worked the other way to
-            $nbr = exp($log0 + (log(abs($regs[3])) - $log0)*mt_rand()/mt_getrandmax());
-
-            // Reformat according to the precision $regs[4]:
-
-            // Determine the format 0.[1-9][0-9]* for the nbr...
-            $p10 = 0;
-            while ($nbr < 1) {
-                --$p10;
-                $nbr *= 10;
-            }
-            while ($nbr >= 1) {
-                ++$p10;
-                $nbr /= 10;
-            }
-            // ... and have the nbr rounded off to the correct length
-            $nbr = round($nbr, $regs[4]);
-
-            // Have the nbr written on a suitable format,
-            // Either scientific or plain numeric
-            if (-2 > $p10 || 4 < $p10) {
-                // Use scientific format:
-                $eX = 'e'.--$p10;
-                $nbr *= 10;
-                if (1 == $regs[4]) {
-                    $nbr = $nbr.$eX;
-                } else {
-                    // Attach additional zeros at the end of $nbr,
-                    $nbr .= (1==strlen($nbr) ? '.' : '')
-                            . '00000000000000000000000000000000000000000x';
-                    $nbr = substr($nbr, 0, $regs[4] +1).$eX;
-                }
-            } else {
-                // Stick to plain numeric format
-                $nbr *= "1e$p10";
-                if (0.1 <= $nbr / "1e$regs[4]") {
-                    $nbr = $nbr;
-                } else {
-                    // Could be an idea to add some zeros here
-                    $nbr .= (ereg('^[0-9]*$', $nbr) ? '.' : '')
-                            . '00000000000000000000000000000000000000000x';
-                    $oklen = $regs[4] + ($p10 < 1 ? 2-$p10 : 1);
-                    $nbr = substr($nbr, 0, $oklen);
-                }
-            }
-
-            // The larger of the values decide the sign in case the
-            // have equal different signs (which they really must not have)
-            if ($regs[2] + $regs[3] > 0) {
-                return $nbr;
-            } else {
-                return -$nbr;
-            }
-
+            $nbr = exp($log0 + (log(abs($regs[3])) - $log0)*mt_rand()/mt_getrandmax());        
+            return sprintf("%.".$regs[4]."f",$nbr);
         } else {
             error("The distribution $regs[1] caused problems");
         }
index a9f1943585f3986f7dee70f7379712c017e36cee..593b6353ed6bbae5625028a83b3404d07848dc1e 100644 (file)
@@ -74,6 +74,7 @@ class question_dataset_dependent_items_form extends moodleform {
         $j = (($this->noofitems) * count($this->datasetdefs))+1;
         foreach ($this->datasetdefs as $defkey => $datasetdef){
             $mform->addElement('text', "number[$j]", get_string('param', 'qtype_datasetdependent', $datasetdef->name));
+            $mform->setType("number[$j]", PARAM_NUMBER);
             $this->qtypeobj->custom_generator_tools_part(&$mform, $idx, $j);
             $idx++;
             $mform->addElement('hidden', "definition[$j]");
@@ -90,7 +91,7 @@ class question_dataset_dependent_items_form extends moodleform {
         for ($i=10; $i<=100 ; $i+=10){
              $addremoveoptions["$i"]="$i";
         }
-                    $mform->addElement('header', 'additemhdr', get_string('add', 'moodle'));
+        $mform->addElement('header', 'additemhdr', get_string('add', 'moodle'));
         $mform->closeHeaderBefore('additemhdr');
 
         if ($this->qtypeobj->supports_dataset_item_generation()){
@@ -128,10 +129,12 @@ class question_dataset_dependent_items_form extends moodleform {
             $mform->addElement('header', '', get_string('itemno', 'qtype_datasetdependent', $i));
             foreach ($this->datasetdefs as $defkey => $datasetdef){
                 $mform->addElement('text', "number[$j]", get_string('param', 'qtype_datasetdependent', $datasetdef->name));
-
+                $mform->setType("number[$j]", PARAM_NUMBER);
                 $mform->addElement('hidden', "itemid[$j]");
+                $mform->setType("itemid[$j]", PARAM_INT);
 
                 $mform->addElement('hidden', "definition[$j]");
+                $mform->setType("definition[$j]", PARAM_NOTAGS);
 
                 $j--;
             }
@@ -139,10 +142,6 @@ class question_dataset_dependent_items_form extends moodleform {
                 $repeated[] =& $mform->addElement('static', "answercomment[$i]", $strquestionlabel);
             }
         }
-        $mform->setType('number', PARAM_NUMBER);
-        $mform->setType('itemid', PARAM_INT);
-        $mform->setType('definition', PARAM_NOTAGS);
-
 
 //------------------------------------------------------------------------------------------------------------------------------
         //non standard name for button element needed so not using add_action_buttons