ひつじTips

技術系いろいろつまみ食います。

鴨川等間隔の法則(っぽいやつ)のアルゴリズム

鴨川等間隔の法則というのをご存知でしょうか?

f:id:mu-777:20210324161836p:plain

京都鴨川の河川敷に座るカップルは等間隔になる,というものです.詳しい中身は以下などがわかりやすいかな,と思います.

services.osakagas.co.jp

この記事からの引用ですが,

先生のお話では、「電車のシートでも同じことが起こります。まず端に人が座り、次に真ん中、その次は端と真ん中の間にできた空間の中央に座って、両サイドと同じ間隔があくようにする傾向があります。それが人間の習性なんです」とのこと。

は,日常的に感じられるかなと思います.

で,この鴨川等間隔の法則に従う場合,i番目の人が0から1の間の座るべき位置を返すアルゴリズム(というか関数)を実装してみたのがこの記事の内容になります.

kamogawa_algorithm
鴨川等間隔の法則(っぽいやつ)のアルゴリズム
(「いらすとや」さんの「マガモのイラスト」を使わせていただきました.感謝.)

実装

pythonで実装してます.

def kamogawa_algo(idx):
    binlen = lambda i: len(bin(i)) - 2
    if(binlen(idx)==1):
        return idx
    divnum = pow(2, binlen(idx-1))
    startnum = pow(2, binlen(idx-1)-1)
    return ((idx - startnum)*2-1)*(1.0/divnum)


上のカモさんのgifを作ってるコードはこちら:

kamogawa_algo.py · GitHub

# この,あいだあいだを取っていくような数列(?)って正式名称ありそうだけど何て言うのかな... 結局ググり力が足りず,見つけられなかった...

用途例

もともとは,トータルのN数がわからないが次々に色を振り分けたい,というケースで,i-1番目に振った色とできるだけ異なる色をi番目に振りたい,と思ったときに「鴨川等間隔の法則」的に振り分ければいいんじゃね,と思ったのがきっかけでした.

kamogawa_color
鴨川等間隔の法則を利用して色を振り分ける様子


この用途なら,適当に色を並べた配列 [青, 赤, 緑, 黄, ...] を用意しておいて,それを順繰りに割り当てる,みたいな方法で全然いいんですけど...... なんか芸がないなと思ってコレに至りました.

まぁでもIndex数が大きくなると,i-1番目の色とi番目の色が似てくるんですけどね......

実装のアイデア

そんなに詳しく書くほどのことではありませんが... 

下図のように書き出すと,2進数で表したIndexと出力の関係性が見えてくるかと思います.

idea
イデアの着想の図

ホントの鴨川等間隔の法則

たぶん,ホントの鴨川等間隔の法則は,新しいカップルが来たらそのタイミングでは等間隔が崩れるものの,段々とみんなが位置を調整して最終的に等間隔になる
というような時間方向に平衡を取っていくエントロピー的なものだと思ってます.

なんで,こちらの「鴨川カップルシミュレーション」の挙動の方が,ホントの鴨川等間隔の法則かと思います.

www.pitecan.com

(作者はまさかのインタラクション界隈では有名な増井先生でした...!)

なんで,この記事のようにきっちりと間を取っていくようなものは厳密には鴨川等間隔の法則ではなさそうなんですが...... まぁ細かい話はどうでもいいか🤪🤪