mirror of
https://github.com/moodle/moodle.git
synced 2025-03-14 04:30:15 +01:00
MDL-12503 Loguniform and MDL-12421 rounding
This commit is contained in:
parent
f7b3e5a50b
commit
87cd4f5469
@ -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");
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user