Проблема с накатыванием случайных чисел «dice» и последующим суммированием значений (GAS)

#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)};                         
}