Google выдает взаимоисключающий генератор случайных чисел по порядку номеров - PullRequest
5 голосов
/ 18 января 2020

Глоток этого ... Я сейчас использую приведенный ниже скрипт для генерации случайного числа от 1 до 200 в ячейках I6: M6. Для моей предполагаемой цели у этого скрипта есть две проблемы (ни одна из которых не является основной, но я бы хотел, чтобы некоторые «poli sh».

Проблема 1) не были взаимоисключающими. Это самая большая проблема, поскольку каждое из пяти чисел ДОЛЖНО быть уникальным. Маловероятно, что они будут повторяться, но это несколько раздражает, когда это происходит.

Проблема 2) Я абсолютно не представляю, как или вообще возможно генерировать эти случайные числа, а затем помещены в I6: M6 в числовом порядке, I6 является наименьшим.

Я - полный любитель и JavaScript (и любой другой код), и мне удалось только собрать это вместе из информации, которую я нашел в другом месте, но у меня есть очень смутное понимание того, как это работает.

///////////////////////////////////////

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [ {name:"Roll Dice",functionName:"rollDice"} ];
  sheet.addMenu("Script", entries);
};

function rollDice() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("sheet1 (New)");
    var cell = sheet.getRange("I6");
  cell.setValue( Math.floor((Math.random()*200)+1) );
    var cell = sheet.getRange("J6");
  cell.setValue( Math.floor((Math.random()*200)+1) );
    var cell = sheet.getRange("K6");
  cell.setValue( Math.floor((Math.random()*200)+1) );
    var cell = sheet.getRange("L6");
  cell.setValue( Math.floor((Math.random()*200)+1) );
    var cell = sheet.getRange("M6");
  cell.setValue( Math.floor((Math.random()*200)+1) );

};

///////////////////////////////////////

Ответы [ 4 ]

3 голосов
/ 18 января 2020

зачем вообще скрипт? Эта простая формула в I6 должна сделать это:

=TRANSPOSE(SORT(SORTN(SEQUENCE(200),5,0,RANDARRAY(200),1)))
2 голосов
/ 18 января 2020

Я добавил функцию сортировки в функцию mainL oop, теперь должен сортироваться численно.

function myFunction() {
  mainLoop()
}

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("sheet1");

function generateNumber(){
return Math.floor((Math.random()*200)+1)
}

function setValue(_val, _address){
   var cell =  sheet.getRange(_address)
   cell.setValue(_val)
}

function generate(){
  var array = []
  while(array.length<5){
    var rand = generateNumber()
    var isUnique = array.indexOf(rand) === -1
    if(isUnique){
      array.push(generateNumber())
    }

  }
  return array
}

function mainLoop(){
    var array = generate()
      array.sort(function(a, b) {
  return a - b;
});
    var addresses = ['I6','J6','K6','L6','M6']
    addresses.forEach(function (_address,_index){
        setValue(array[_index],_address)
    })
}
0 голосов
/ 19 января 2020

Вы можете импортировать rando js? Если это так, вы можете легко получить массив упорядоченных уникальных случайных чисел от 1 до 200, например:

var sequence = randoSequence(1, 200).slice(0, 5).sort(function(a, b){return a-b});

console.log(sequence);
<script src="https://randojs.com/1.0.0.js"></script>

Так что вы можете просто изменить свою функцию rollDice(), чтобы она выглядела следующим образом:

function rollDice() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1 (New)");
  var sequence = randoSequence(1, 200).slice(0, 5).sort(function(a, b){return a-b});
  sheet.getRange("I6").setValue(sequence[0]);
  sheet.getRange("J6").setValue(sequence[1]);
  sheet.getRange("K6").setValue(sequence[2]);
  sheet.getRange("L6").setValue(sequence[3]);
  sheet.getRange("M6").setValue(sequence[4]);
}
0 голосов
/ 18 января 2020

Нечто подобное должно сработать.

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{ name: "Roll Dice", functionName: "rollDice" }];
  sheet.addMenu("Script", entries);
}

function rollDice() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("sheet1 (New)");
  var numbers = [];
  while (numbers.length < 5) {
    var number = Math.floor(Math.random() * 200 + 1);
    if (numbers.indexOf(number) != -1) {
      numbers.push(number);
    }
  }
  numbers.sort((a, b) => a - b);
  ["I6", "J6", "K6", "L6", "M6"].forEach((addr, index) => {
    var cell = sheet.getRange(addr);
    cell.setValue(numbers[index]);
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...