#google-apps-script
#google-apps-script
Вопрос:
Я уже несколько часов пытаюсь выяснить, почему моя функция случайного броска «dice» не дает результатов, которые я ищу.
Моя функция roll:
function roll(min, max, count) {
min = Math.ceil(min);
max = Math.floor(max);
var result = []
for (var i = 0; i < count; i ){
result.push(Math.floor(Math.random() * max) 1);
}
return resu<
}
Моя функция вызова:
var stats = [];
var STR = roll(1,6,STRrolls);
Logger.log(STR);
STRrolls имеет значение 3. Журнал выглядит следующим образом:
[19-03-20 23:26:12:730 GMT] [1.0, 3.0, 5.0]
Вот где я ошибаюсь. Я пытаюсь суммировать 3 значения, а затем сохранить их в массиве «статистика» как одно значение, чтобы я мог повторить процесс с несколькими другими массивами. тоже.
Вот лучший пример моего скрипта:
function roll(min, max, count) {
min = Math.ceil(min);
max = Math.floor(max);
var result = []
for (var i = 0; i < count; i ){
result.push(Math.floor(Math.random() * max) 1);
}
return resu<
}
function sumArr(array) {
return array.reduce(function(a,b){
return a b
}, 0);
}
function CHAR {
var C_R = SpreadsheetApp.getActive().getSheetByName('Char_Ref')
var STRrolls = C_R.getRange("F2").getValue();
var DEXrolls = C_R.getRange("F3").getValue();
var RESrolls = C_R.getRange("F4").getValue();
var EMProlls = C_R.getRange("F5").getValue();
var STArolls = C_R.getRange("F6").getValue();
var stats = [];
var STR = roll(1,6,STRrolls);
Logger.log(STR);
var DEX = roll(1,6,DEXrolls);
var RES = roll(1,6,RESrolls);
var EMP = roll(1,6,EMProlls);
var STA = roll(1,6,STArolls);
stats.push([STR,DEX, RES, EMP, STA])
rangeStats.setValues(stats);
rangeClass.setValue(CLASSval);
rangeLevel.setValue(1);
}
Проблема в том, что запуск этой функции выдает один и тот же журнал до и после:
[19-03-20 17:03:13:560 PDT] [3.0, 1.0, 4.0] [19-03-20 17:03:13:561 PDT] [3.0, 1.0, 4.0]
Комментарии:
1. Где тот код, который вы пробовали, который не суммирует значения? Вы пробовали
Array#reduce
? Где находятся сообщения об ошибках, связанные с вашим кодом? Наверняка вы нашли в Интернете другие страницы, посвященные суммированию содержимого массива… Итак, что произошло, когда вы попробовали эти рекомендации?2. Привет, @tehhowch — Да, я пробовал reduce, но не смог заставить его работать. Он просто возвращает тот же результат регистрации. Я использовал это: функция sumArr(array) { возвращает array.reduce(функция (a, b){ возвращает a b}, 0); } Вы выглядите расстроенным (возможно, я ошибаюсь, я аутист). Прошу прощения, если я не предоставил достаточно подробностей. Я пытался. У меня нет всех различных методов, которые я пробовал, и связанных с ними ошибок, поскольку я заменял их каждый раз, когда они не работали. Спасибо.
3. Я не понимаю, почему за меня проголосовали. Я пытался искать ответ и пытался делать это для себя и достиг предела своих знаний, и поэтому прошу о помощи — почему людей это раздражает? :-/
4. Если вы не покажете, что вы сделали, люди будут просто повторять вашу работу, тратя время каждого. Покажите в своем вопросе свой код, который отражает то, как вы суммировали и как вы смотрели на сумму. Обратите внимание, что методы класса array обычно не изменяют исходный массив…
5. Спасибо, @tehhowch — Я отредактировал свой вопрос, чтобы отразить ваше предложение.
Ответ №1:
нравится это?:
function getSum(total, num) {
return total num;
}
var stats = [];
var STR = roll(1,6,STRrolls);
stats = STR.reduce(getSum);
Logger.log(STR);
вы вставили каждое значение в массив и не выполнили никакой операции добавления.
Комментарии:
1. Выдает один и тот же журнал до и после вызова функции getSum: [19-03-20 23:50:56:079 GMT] [3.0, 5.0, 6.0] [19-03-20 23:50:56:080 GMT] [3.0, 5.0, 6.0]
Ответ №2:
Я обнаружил, что это интересная проблема. Установление максимального и минимального значения каждого броска не так очевидно, как можно было бы предположить на первый взгляд.
function repeatRolls(cnt) {
var cnt= cnt || 100;
var mindie=100000;
var maxdie=-100000;
var s='<style>th,td{border: 1px solid black;padding:5px;}</style><table>';
for(var i=0;i<cnt;i ) {
var rObj=rollTheDice(12,-12,20);
if(i==0) {
s ='<tr><th>Roll</th>';
for(var k=0;k<rObj.roll.length;k ) {
s =Utilities.formatString('<th>Die %s</th>',k 1);
}
s ='<th>Sum</th></tr>';
}
s =Utilities.formatString('<tr><td>%s</td>',i 1);
for(var j=0;j<rObj.roll.length;j ) {
s =Utilities.formatString('<td>%s</td>', rObj.roll[j]);
if(rObj.roll[j]>maxdie){maxdie=rObj.roll[j];}
if(rObj.roll[j]<mindie){mindie=rObj.roll[j];}
}
s =Utilities.formatString('<td>%s</td></tr>',rObj.total);
}
s =Utilities.formatString('</table><br />maxdie: %s<br />mindie: %s',maxdie,mindie);
var userInterface=HtmlService.createHtmlOutput(s).setWidth(1200);
SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Rolling the Dice');
}
Функция броска с параметрами max die, min die и number of dice, которые действительно работают.
function getSum(total,num) {
return total num;
}
function rollTheDice(max,min,num) {
var num = num || 6;
var min = min || 1;
var max = max || 6
var roll=[];
for (var i=0;i<num;i ){
roll.push(Math.floor(Math.random() * (max-min 1)) min);
}
return {roll:roll,total:roll.reduce(getSum)};
}