見出し画像

【GAS】「全員の目が開いている写真」を撮るのに必要な枚数を計算する関数

かつてイグノーベル賞を受賞した「全員の目が開いている写真」を撮るのに必要な枚数を計算する関数をGoogleスプレッドシートで使いたかった。

…でも、検索してもパッと出てこなかったので、忘備録です🤔


結論:GASのコードがこれ↓

/**
 * 集合写真で全員の目が開いている写真を撮影するのに必要な枚数を計算する
 *
 * @param {number} people - 写真に写る人数
 * @param {number} desiredProbability - 希望する確率(0から1の間)
 * @param {number} shutterSpeed - シャッタースピード(秒)
 * @return {number} 必要な撮影枚数
 * @customfunction
 */
function CALCULATE_PHOTOS(people, desiredProbability, shutterSpeed) {
  // 定数
  const BLINK_DURATION = 0.25;  // 瞬きの持続時間(秒)
  const BLINK_INTERVAL = 6;     // 瞬きの間隔(秒)

  // 1人が目を開けている確率を計算
  const eyesOpenProb = (BLINK_INTERVAL - BLINK_DURATION - shutterSpeed) / BLINK_INTERVAL;

  // 全員が目を開けている確率を計算
  const allOpenProb = Math.pow(eyesOpenProb, people);

  // 必要な撮影枚数を計算
  const requiredShots = Math.ceil(Math.log(1 - desiredProbability) / Math.log(1 - allOpenProb));

  return requiredShots;
}

まず、これ↑をマクロ.gs↓にコピペして「CALCULATE_PHOTOS関数」を作る。

スプレッドシートの「拡張機能」→「Apps Script」で この画面を開く

次に、こんな感じ↓で「CALCULATE_PHOTOS関数」を使う。

そしたら、こんな感じでスプレッドシート関数として計算できる。

おしまい!😇


ちなみに…

最初の方は撮影枚数と人数は(1人を除いて)、撮影枚数の方が少ないんだけど…

59人で逆転します。(撮影枚数の方が多くなる)

それから必要な撮影枚数がものすごく増えていき…300人だと、こうなる↓

300人だと2,452,811枚

つまり、確率的には300人いると、「99%の確率で全員目を開けている写真」を撮影するのには約250万枚の撮影が必要…と笑

学年の集合写真とかを見ると、どうしても微妙な写りの人が出てくるのも納得できるかも…🤣


参考にしたサイト


いいなと思ったら応援しよう!

キムラ ヨシト
読んでいただきありがとうございます!✨ 内容が「良かった」と思った方は ↑スキをポチッとしていただけると嬉しいです! さらにコメントやサポートをいただけると、とても励みになります!🔥