Google Spreadsheet генерирует случайные числа с помощью Math.random ()

Я пытаюсь написать функцию скрипта, которая вызывает Javascript Math.random() для генерации случайного числа между [0, 1) , вот так:

function f() {
  return Math.random();
}

, и я вызываю его из ячейки:

Случайное число

Однако каждый раз, когда я обновляю электронную таблицу (используя F5 или Ctrl + R ), он возвращает тот же номер.

Причина, по которой я не использую таблицу RAND(), я хочу сделать сложное вычисление в f(). Я попытался передать RAND() в качестве параметра из электронной таблицы и вернуть параметр, но в этом случае эта функция никогда не возвращается:

Случайное число 2

Есть ли способ генерировать восстановимое случайное число внутри функции?

7 голосов | спросил Yang 29 62014vEurope/Moscow11bEurope/MoscowSat, 29 Nov 2014 18:54:45 +0300 2014, 18:54:45

3 ответа


2

Генерирование случайных чисел может помочь генерировать случайные числа на листе google google

введите описание изображения здесь>> </p>

<p> Для получения более подробной информации нажмите <a href= здесь

ответил Vembu 30 PMpThu, 30 Apr 2015 21:00:42 +030000Thursday 2015, 21:00:42
2

Короткий ответ

Вместо использования пользовательской функции используйте встроенную функцию, когда это возможно, или используйте функцию, вызванную событием.

Объяснение

Как указано в OP, Google Таблицы имеют встроенную функцию для возврата случайных чисел от 0 до 1: RAND .

В случаях, когда для выполнения сложных вычислений, которые невозможно или эффективно со встроенными функциями, требуется один из вариантов использования скрипта Google Apps. Стоит иметь в виду, что пользовательские функции пересчитываются только при изменении одного из их аргументов, с другой стороны их аргументы должны быть детерминированными, поэтому использование таких функций, как NOW (), TODAY (), RAND () и RANDBETWEEN (), будет возвращено ошибка, даже если они вложены в другие функции функций электронных таблиц или включены косвенно через ссылки.

Скрипты Google Apps имеют два типа событий, простые и устанавливаемые. См. https://developers.google.com/apps-script/guides/triggers/ для получения более подробной информации.

Пример

Следующий код будет обновлять указанную ссылку на одну ячейку каждый раз, когда пользователь редактирует электронную таблицу со случайным числом, сгенерированным с помощью Math.random().

var reference = 'A1';

функция onEdit (e) {
  SpreadsheetApp
    .getActiveSheet ()
    .getRange (ссылка)
    .setValue (Math.random ());
}

Ссылки

ответил Rubén 17 MarpmThu, 17 Mar 2016 14:26:21 +03002016-03-17T14:26:21+03:0002 2016, 14:26:21
2

Примечание. Этот ответ был действителен только для старых таблиц Google. В настоящее время недетерминированные функции, такие как NOW(), являются не разрешено в качестве аргументов пользовательских функций . Попытка сделать так приводит к сообщению об ошибке «Эта функция не может ссылаться на ячейку с помощью NOW(), RAND(), или RANDBETWEEN() ".


Функции в скрипте Google Apps должны быть детерминированными. Поскольку ваша пользовательская функция не имеет параметров, она будет возвращать одинаковый результат каждый раз.
См. Проблема 2573: Math.random () doesn ' t пересчитывать как формулу электронной таблицы .

Чтобы каждый раз создавать новое случайное число, вы думаете, что он должен работать, чтобы передать текущую временную метку в качестве параметра:

 =f(now())

Однако эта функция, похоже, никогда не вернется. Я предполагаю, что это связано с тем, что возвращаемое значение NOW() изменяется каждые миллисекунды, и для вычисления требуется более одной миллисекунды.

Итак, вам придется согласиться на то, что не нужно часто обновлять, например

=f(day(now()))

Это возвращает новое случайное значение каждый день месяца.

Обратите внимание, что если вы используете эту формулу в более чем одной ячейке, она вернет одинаковое случайное значение для всех ячеек. Чтобы этого избежать, вы также можете передавать текущие координаты ячейки как параметры:

=f(day(now()), 2, 4)

Я установил пример таблицы , не стесняйтесь чтобы посмотреть.


Вместо ввода новых параметров вам может удалась попытка изменить настройку в Файл → Параметры электронной таблицы → Пересчет на Вкл. и каждую минуту . По крайней мере, это должно работать для RAND(), см. документация .  В настоящее время это дает мне сообщение об ошибке, поэтому я не могу понять, работает ли это.

ответил Vidar S. Ramdal 31 WedEurope/Moscow2014-12-31T15:38:48+03:00Europe/Moscow12bEurope/MoscowWed, 31 Dec 2014 15:38:48 +0300 2014, 15:38:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132