Google Spreadsheet генерирует случайные числа с помощью Math.random ()
Я пытаюсь написать функцию скрипта, которая вызывает Javascript Math.random()
для генерации случайного числа между [0, 1) , вот так:
function f() {
return Math.random();
}
, и я вызываю его из ячейки:
Однако каждый раз, когда я обновляю электронную таблицу (используя F5 или Ctrl + R ), он возвращает тот же номер.
Причина, по которой я не использую таблицу RAND()
, я хочу сделать сложное вычисление в f()
. Я попытался передать RAND()
в качестве параметра из электронной таблицы и вернуть параметр, но в этом случае эта функция никогда не возвращается:
Есть ли способ генерировать восстановимое случайное число внутри функции?
3 ответа
Генерирование случайных чисел может помочь генерировать случайные числа на листе google google
здесь
Короткий ответ
Вместо использования пользовательской функции используйте встроенную функцию, когда это возможно, или используйте функцию, вызванную событием.
Объяснение
Как указано в 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 ()); }
Ссылки
Примечание. Этот ответ был действителен только для старых таблиц Google. В настоящее время недетерминированные функции, такие как NOW()
, являются не разрешено в качестве аргументов пользовательских функций . Попытка сделать так приводит к сообщению об ошибке «Эта функция не может ссылаться на ячейку с помощью NOW()
, RAND()
, или RANDBETWEEN()
".
Функции в скрипте Google Apps должны быть детерминированными. Поскольку ваша пользовательская функция не имеет параметров, она будет возвращать одинаковый результат каждый раз.
См. Проблема 2573: Math.random () doesn ' t пересчитывать как формулу электронной таблицы .
Чтобы каждый раз создавать новое случайное число, вы думаете, что он должен работать, чтобы передать текущую временную метку в качестве параметра:
=f(now())
Однако эта функция, похоже, никогда не вернется. Я предполагаю, что это связано с тем, что возвращаемое значение NOW()
изменяется каждые миллисекунды, и для вычисления требуется более одной миллисекунды.
Итак, вам придется согласиться на то, что не нужно часто обновлять, например
=f(day(now()))
Это возвращает новое случайное значение каждый день месяца.
Обратите внимание, что если вы используете эту формулу в более чем одной ячейке, она вернет одинаковое случайное значение для всех ячеек. Чтобы этого избежать, вы также можете передавать текущие координаты ячейки как параметры:
=f(day(now()), 2, 4)
Я установил пример таблицы , не стесняйтесь чтобы посмотреть.
Вместо ввода новых параметров вам может удалась попытка изменить настройку в Файл → Параметры электронной таблицы → Пересчет на Вкл. и каждую минуту .
По крайней мере, это должно работать для RAND()
, см. документация .
В настоящее время это дает мне сообщение об ошибке, поэтому я не могу понять, работает ли это.