Проблема с бросающимися случайными числами в кости и суммированием значений (GAS) - PullRequest
1 голос
/ 21 марта 2019

Я часами пытался выяснить, почему моя функция случайного броска "кубиков" не даст желаемых результатов.

Моя функция броска:

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 result;
}

Моя функция вызова:

var stats = [];
var STR = roll(1,6,STRrolls);
Logger.log(STR);

STRrolls имеет значение 3. Журнал выглядит так:

[19-03-20 23:26:12:7:30 по Гринвичу] [1.0, 3.0, 5.0]

Вот здесь я и спотыкаюсь.Я пытаюсь суммировать 3 значения и затем сохранить их в массиве «stats» как одно значение, чтобы я мог повторить процесс и с несколькими другими массивами.

Вот лучший примерМой сценарий:

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 result;
}

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]

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

как это?:

function getSum(total, num) {
  return total + num;
}
var stats = [];
var STR = roll(1,6,STRrolls);

stats = STR.reduce(getSum);
Logger.log(STR);

Вы выдвинули каждое значение в массиве и не сделали никакой операции добавления.

1 голос
/ 21 марта 2019

Я обнаружил, что это интересная проблема.Установление максимума и минимума каждого броска не так очевидно, как можно было бы сначала догадаться.

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 и количеством реально работающих кубиков.

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)};                         
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...