2015年11月7日土曜日

Google Spreadsheet - カスタム関数 RANDCHANGE

実験中。カスタム関数化は共通の処理を纏めることで、コードの保守性向上を狙うものだけど、
頻繁に行う処理をカスタム関数にする場合のデメリットが、まだ把握できてない。

例えば、多数のセルを参照する場合等は、数式で書いた方がよさそう。
これを多量の引数を取る関数としてしまった場合、
シート側からロジックが把握しにくくなる等の副作用が出てくる。

百分率

整数の場合

整数値でパーセント指定する場合、組み込み関数のRANDBETWEEN(0,99) が使える。

少数の場合

シートで "70%" とパーセンテージ付きの書式で記入すると、
数式上では少数の 0.7 として扱われます。
カスタム関数で確率の判定…するまでもなく、RAND()との比較のみで済みそう。

出番がなさそうだけど。今回は、カスタム関数にする事で注意しないといけない点の考察。

/**
 * 与えられた確率でランダムに bool値 を返す関数
 *
 * @param {float} rate 0.0 以上 1.0 以下の値
 * @return {boolean}
 * @customfunction
 */
function RANDCHANCE(rate) {
  // NOTE: Math.random() は、0 以上 1 未満の値を返します
  return Math.random() <= rate;
}

等号を含める理由は、JavaScript の少数の実装では概数で表現されている為、
桁数が増えた場合、例えば 0.99999999999999999 < 1.0 は false になってしまう。
rateに100%を設定したにもかかわらず、falseになる可能性が出てきます。

まるめ誤差の問題もありますが、実際の用途でそれ程細かな精度を必要としない場合は無視できる程度です。

注意事項

  • 数式上とScript上での数値型の違い
  • 頻繁に呼び出す関数をカスタム関数にする場合、カスタム関数の呼び出しコストに注意。
  • カスタム関数内でSpreadsheetAppのAPI呼び出しすると遅くなるので、数式から引数で渡す。
  • シート上の数式で乱数を、引数としてカスタム関数に渡すことはできない等の制限に注意。

0 件のコメント:

コメントを投稿