この記事はTCU-CTRL場外乱闘 Advent Calendar 2018 14日目の記事です。

13日の記事はこちらです。

foruthia.hatenablog.com

うごメモの存在は知りませんでしたが、新サービスのうごメモが失敗した理由に、表現の幅が広がったこと(色は少ないほうがよかった)を挙げていたのが面白かったです。制限されていたほうが面白いものが作れるということなのでしょうか。文章を見るに、フォルティア氏もうごメモを作る側すなわちクリエイターだと思うのですが、作る側からこういった言葉が出るのはおもしろいですね。

去年書いた記事の補足と今年プレイしたゲームの感想を書きます。スペースを埋めるために司馬遼太郎の感想も書きます。

去年の補足

前回の記事ではロジスティック写像確率密度関数をn等分するパラメータの一般項をあらわす式\eqref{eq:yyy}を紹介して終わりました。

\begin{align}
\label{eq:yyy} a_{k}=\frac{1}{4} (2+(-1)^{\frac{n-k}{n}}-(-1)^{\frac{k}{n}})
\end{align} 

 -1の累乗が気持ち悪いのでなんとかします。
使うのはオイラーの公式です。

\begin{align}
\label{eq:eu1} e^{i \theta}=cos \theta + isin \theta
\end{align} 

 \theta = \piをぶち込むと有名なオイラーの等式になります。

\begin{align}
\label{eq:eu2} e^{i \pi}=cos \pi + isin \pi
=-1
\end{align} 

よって以下の式が成り立ちます。

\begin{align}
\label{eq:k} (-1)^{\frac{k}{n}}=cos \frac{\pi k}{n} + isin \frac{\pi k}{n}
\end{align} 

\begin{align}
\label{eq:nk} (-1)^{\frac{n-k}{n}}=cos \frac{\pi(n-k)}{n} + isin \frac{\pi(n-k)}{n}
\end{align} 

式\eqref{eq:k},\eqref{eq:nk}を\eqref{eq:yyy}にぶち込みます。

\begin{align}
\begin{split}
\label{eq:akk} a_{k}& =\frac{1}{4} (2+cos \frac{\pi(n-k)}{n} + isin \frac{\pi(n-k)}{n}-(cos \frac{\pi k}{n} + isin \frac{\pi k}{n})) \\
&= \frac{1}{4} (2+cos(\pi - \frac{\pi k}{n}) + isin(\pi - \frac{\pi k}{n})-(cos \frac{\pi k}{n} + isin \frac{\pi k}{n})) \\
&=\frac{1}{4} (2-cos\frac{\pi k}{n}+isin \frac{\pi k}{n}-cos \frac{\pi k}{n}-isin \frac{\pi k}{n}) \\
&=\frac{1}{4} (2-2cos\frac{\pi k}{n}) \\
&=\frac{1}{2} (1-cos\frac{\pi k}{n}) \\
\end{split}
\end{align} 
わりときれいな式になりました。

ロジスティック写像確率密度関数の式はこんなでした。

\begin{align}
\label{eq:logp} p(x)=\frac{1}{\pi \sqrt{x(1-x)}}
\end{align} 

先ほど式変形した a_{k}は\eqref{eq:logp}をn等分するパラメータなので次の等式が成り立つはずです。

\begin{align}
\label{eq:Pin} \int_{a_{k}}^{a_{k+1}} p(x) dx = \frac{1}{n}
\end{align} 

\eqref{eq:logp}の積分結果は\eqref{eq:Px}になります。

\begin{align}
\label{eq:Px} \int_{}^{} p(x) dx=\frac{2 \sqrt{x-1} \sqrt{x} \log(\sqrt{x-1}+\sqrt{x})}{\pi \sqrt{-(x-1)x}} + constant
\end{align}

\eqref{eq:Pin}をこねくり回してみたのですが、自分の脳みそではうまく証明することができませんでした。超絶暇な人はチャレンジしてみてください。そしてぜひ結果を教えてください。

申し訳程度の数学要素終了。以下本編

今年プレイしたゲームの感想

今年遊んだゲームの感想を垂れ流します。ネタバレがあったりなかったりするので注意してください。

ソウルシリーズ

いつかやろうと思っていたゲーム群である。3→ブラッドボーン→1→2と滅茶苦茶な順番で遊んだ。デモンズソウルのリメイクはまだですか。

ダークソウル1(リマスター版)

3とブラッドボーンをクリアした後だったために余裕でクリアできた作品...になるはずだった
実際にはゲーム全編を通してキャラクターのモッサリ感に常に苦しんでいた。他作品と比較して篝火(コンティニューポイント)が少なく、移動やボスとの再戦がめんどくさい。対人要素が人気なのか、侵入プレイヤーはガチ勢が多く、エリア攻略中でも容赦なくぶち殺されまくった。つまらなくはないが2018年になりわざわざ遊ぶほどの作品ではない気がした。鐘のガーゴイルとシースは絶対に許さない。

ダークソウル2

巷ではなにかと不評な作品だが個人的にはかなり楽しめた。他作品と比べるとマップの形状や敵の動きが単調であり、特にボス戦はあっけないものが多かった。アクション要素はつまらないものの、マップや敵・装備品の多彩さでは他作品の追随を許さず、RPGとしてかなり楽しめた。ダークソウルというのはアクション・戦闘と同じくらいに探索がおもしろいゲームだと思っている。この探索要素という点でいえばシリーズ屈指の楽しさなので普通に良ゲーだと思います。ついでにグレートソードがかっこいい。余談だがソウルシリーズを遊ぶ際にはオンライン環境で遊んでいるため、他プレイヤーに侵入されたりする。だがしかし、2ではシリーズで唯一ゲームプレイ全体を通して1度も侵入を受けなった。過疎化が凄まじい。

ダークソウル3

普通におもしろい。ユニークな武器が多く、戦闘が楽しい。ファランの大剣で敵の集団に突っ込んで調子に乗り、侵入プレイヤーにパリィされて殺されるのはよくある話である。また、ボスが強い。ミディールはまじで頭おかしいと思う。

ブラッドボーン

問:盾に頼り切った人間が盾を縛るとどうなるか?
答:死ぬ
とにかくスピード感がすごい。盾がつかえないため、基本的には攻撃を避けるorさっさと敵を倒すしか選択肢がない。反射神経弱者としてはつらいものがあった。慣れてくると内臓攻撃が楽しい。3と同じくボスが強い。冒涜アメンドーズはまじでキチガイだと思う。この間のセールでDLCを買ったが未着手である。まくら大先輩がガチギレしたボスが登場するとのことで楽しみである。

ラチェット&クランク THE GAME

初代作品のリメイクということでストーリーが大幅に変わりグラフィックが超絶進化した。PS2時代に1~3を狂ったように遊んだ身としては感慨深いものがあった。PS2時代でもグラフィックのきれいさに驚いたものだが、PS4版でも驚かされた。過去作を遊んでいるとニヤリとできるネタも多く、ファンサービスに満ちた作品であった。だが純粋なアクションゲームとしての楽しさは過去作には及ばない。ゲーム自体もボリューム不足感が残念だった。他作品リメイクの際には改善されていることを期待する。

ニーアオートマタ

稀代の尻ゲー。ストーリーはよくわからんかった。

モンスターハンターワールド

人生において初めてまともに取り組んだモンハンである。下位の初見アンジャナフが楽しさのピークだった。最近ではDLCに備えてちまちまプレイしている。慣れるとバゼルギウスが仲間に思える。受付嬢はうざい。ナナは死んどけ。

アンダーテール

求アズゴア弱化パッチ

Dead Cells

ローグヴァニアとかいう謎ゲー。1プレイ1時間ほどで遊べ、ビルドや装備次第でプレイスタイルが大きく変わるのが楽しい。周回プレイによるハクスラ要素もよい。以前にナイトメアまでクリアしたが最近のパッチで高難易度のオワタ式度合いが加速した。攻略記事を書く程度にはハマった。個人的には不思議のダンジョンのようにマップをもっとランダムにしてほしかった。

司馬遼太郎の感想

今年になり司馬遼太郎の作品を読み始めた。きっかけは今年春の中国・大連への訪問である。帰国してなんとなく坂の上の雲を読み始めた。その後は項羽と劉邦燃えよ剣を読んだ。以下簡単な感想。

坂の上の雲

明治維新後~日露戦争終結までを描いた作品である。作中で強く印象に残っているのはロシア帝国の腐敗である。普通ならば絶対に負けない戦争なのに、官僚が互いに足を引っ張りあうことであれほど状況が悪化するのは驚きである。また、戦闘描写もすさまじい。日本海海戦の緊張感は半端じゃない。戦艦同士が遠距離で徹甲弾を撃ち合うのだが榴弾と異なり目に見えて射撃の効果がわからないのである。測量機器も発達していないため、自軍の攻撃が有効なのかがわからない。しかし、敵軍の砲弾はこちらに命中し、甲板では死者が大量に出るのである。自軍が極端に不利な錯覚に陥りつつも、戦闘を継続する船員たちの精神力がすごい。まさしくこんな感じ
f:id:henceee:20181214232017j:plain

項羽と劉邦

古代中国版なろう小説。どんな突拍子もない物語でも、ご都合主義な物語でも、劉邦と比較すると現実的と思える程度にぶっ飛んでる。

燃えよ剣

新選組土方歳三の生涯を描いた作品である。全編にわたりやたらと文章がかっこいい。特に、新撰組内(土方歳三佐幕派)から脱した伊東甲子太郎率いる倒幕派を粛正する際の文章がかっこいい。伊東の死体で敵7人をおびき寄せ、土方率いる新選組40人がリンチするシーンにおける文章である。伊東派7人のうち、4人は早々に逃げ生き延びたが、残り3人は死ぬまで戦った。

死んだのはすべて一流の使い手であった。かれらは脱出しようとしても、剣がそれをゆるさなかった。剣がひとりで動いてはつぎつぎと敵を斃し、死地へ死地へとその持ち主を追い込んで行った。

皮肉にも、この文章は晩年の土方歳三の運命を暗示している。もはや官軍の勢いを止められず、死ぬとわかっていても自分のプライドを優先して戦い続けたのである。

以上で終わります。ありがとうございました。
次回はうろん君です。よろしくお願いします。

Dead Cellsの個人的攻略法

 

Dead Cellsのノーマル難易度を攻略する上で重要だと思うことを書きます。

この記事を書いている時点(2018年6月現在)では王の手が最後のボスであるため、これを攻略することを目標とします。

回復薬やゴールド引継ぎ・ルーンなどの基本的なアップグレードはある程度済ませているものとします。

本記事では、おすすめの

  • 攻略ルート
  • 装備
  • ビルド
  • ボス戦での立ち回り

を紹介したいと思います。

攻略のコンセプトは設置系スキルの火力をあげて敵を速攻で倒すです。

戦闘は基本的にタレットに任せ、自分は安全な場所から攻撃します。近接型ビルドと比較すると爽快感に欠け、時間がかかるのが難点ですが安定した攻略が可能です。

攻略ルート

おすすめは以下のルートです。

罪人の道→牢獄の深部→納骨堂→高床村→時計塔→天上城

このルートの狙いは以下の通りです。

  • 牢獄の深部・納骨堂ではゾンビ・スラッシャーを狩ることで自動ダブルクロスボウヴィータレットのドロップを狙います。
  • 全体的にボスや敵が弱いため攻略が容易です。
  • エリートの出現率が高いため、良質のアミュレットを拾いやすいです。

道中のエリートは全て倒します。タレットが強いのでなんとかなると思います。

装備

武器編

武器の中では電撃のムチが実用性・入手性ともに優れていておすすめです。金色装備でなくても十分強力なので使いましょう。ムチは火力が低いため不満に思う方もいるかもしれまんせんが、盾持ちやカミカゼへの対処、段差の上からタコ殴りにする際に使用するなど、タレットの補助火力として使用するため問題ありません。

もう片方の武器は氷の弓がおすすめです。手軽に凍結させられる上に、装備に被ダメージ減の効果がつくため便利です。

氷の弓をアンロックしていない場合は盾or適当な金色装備がおすすめです。盾を使用する場合は被ダメージ減の効果がついたものを使いましょう。金色装備はスクロール狙いで使います。両方ともお守りとして持っているだけでいいと思います。

スキル編

スキルは設置系タレットの自動ダブルクロスボウ(ゾンビがドロップ)が非常に強力です。これを2つ持ちましょう。自動ダブルクロスボウが手に入るまでは適当な設置系のスキルで凌ぎましょう。

オプション

装備のオプションはシナジーを意識しましょう。おすすめは毒or炎上を中心とした効果です。

以下強化例:

  • 雷撃のムチ:炎上中の敵に+100%ダメージ
  • 自動ダブルクロスボウ1(着火用):攻撃した軌跡が炎上
  • 自動ダブルクロスボウ2(攻撃用):炎上中の敵に+100%ダメージ

残りは適当なもので大丈夫です。ただし、与ダメージ・被ダメージが共に増加するオプションは事故りやすいので避けましょう。

氷の弓に関しては装弾数が4発と少ないため、貫通効果がつくと心強いです。

装備レベル

道中はあまり気にしなくても大丈夫ですが、現在よりも高レベルのベースが見つかった場合は乗り換えましょう。天上城をクリアした時点で各装備がレベル5くらいあるといいと思います。

ビルド

スクロール

スクロールはタレット・ムチの火力に直結する戦術を中心に強化します。天空城をクリアした時点で装備の補正込みで戦術が15以上あるといいと思います。残りは赤と緑に均等に振ってHPを伸ばしましょう。

呪い

戦術を強化しつつHPを確保するためにも道中の呪われた宝箱は積極的に開けましょう。ただし、時計塔以降は被弾しやすいため、宝箱を開けるのは高床村までにしたほうがいいと思います。また、ゴールドが足りない場合は呪い覚悟で扉を破壊しましょう。

呪いを受ける前はエリアの攻略状況を確認しましょう。特に、ボス戦前に呪いを受け、敵の数が足らず解呪できないと悲惨なことになるので注意しましょう。

ミューテーション

おすすめの順番は以下の通りです。

熟練→ネクロマンシー→サポート→(天上城クリア時にリセット)→熟練・サポート・デッドインサイド

各スキルについて説明します。

  • 熟練:タレットの回転率と火力を上げて効率的にステージを攻略できる。
  • ネクロマンシー:道中で使用。HPが地味に回復する。
  • サポート:タレット付近からムチで攻撃する。意外と強い。
  • デッドインサイド:ボス戦ではネクロマンシーの意味がないためこちらを使う。

天上城をクリアした時にデッドインサイドを覚えるため、HPが大きく伸びます。目安としては、王の手前に8000以上あると事故死しづらくなります。

 

第二の生を使う場合は下のような取得順序になると思います。

第二の生→熟練→デッドインサイド

ただ、この場合は熟練の取得が遅れるためタレットの回転率が落ち、第二ステージ攻略が若干しんどくなります。

ボス戦での立ち回り

  1. タレットを設置する
  2. ローリングなどで攻撃を避ける
  3. いけそうならムチで攻撃する
  4. 1に戻る

以下注意点

  • 回復は早めに飲む。
  • タレットの近くにいるとサポートの恩恵を受けられるのでできれば近くにいる。
  • 無理して攻撃しない。攻撃は基本的にタレットにやらせる。
  • 盾は必ずしも使う必要はない。パリィを狙って被弾するほうが危険。

逃げつつも火力でゴリ押しして回復が尽きる前に倒します。

最後に

初見で王の手と戦った際は為す術もなく殺されましたが、タレットを中心とした戦法を採用することで、下手糞な自分でも最近は安定して勝てるようになりました。

本記事が攻略の参考になれば幸いです。

追記

ハードモード攻略しました。

スクロールの出が悪く、HPや火力が伸び悩みましたが意外といけました。

f:id:henceee:20180701200018j:plain

f:id:henceee:20180701200023j:plain

 

ベリーハード攻略時の装備はこんな感じでした。

f:id:henceee:20180705204756j:plain

f:id:henceee:20180705204759j:plain

 

エキスパート攻略時の装備です。

序盤に「セルと一緒にゴールドも得る」の効果がついたアミュレットを入手しないと装備の強化や回復薬の購入が難しく厳しいです。

f:id:henceee:20180721144434j:plain

f:id:henceee:20180721144429j:plain

 

ナイトメア攻略時の装備です。

初回の変異を第二の生にしました。

f:id:henceee:20180822190059j:plain

f:id:henceee:20180822190109j:plain

ナイトメア攻略について

ナイトメアを攻略する上で重要だと思うのは以下の3点です。

  1. レジェンダリーフォージの強化(道中で++装備が入手可能)
  2. 商品カテゴリーのアンロック(必要な装備がピンポイントで入手可能)
  3. 道中で絶対に被弾しないという強い意志

 1,2については適当に低難易度を周回して準備しましょう。ついでに敵(特に王の手)の攻撃を回避する練習もしましょう。

3については1ステージ1回程度の被弾なら許容範囲だと思います。高床村では確定で回復アイテムが購入できます。道中では、瘴気ゲージの貯まり具合に応じて回復薬目的に貯金するか、装備を強化するかを決定しましょう。早い段階で装備が完成し、お金が余った場合はショップでパワーカテゴリーを選択し、商品リセットを繰り返して使い捨てのトニックなどを購入するといいと思います。

 

ルートを通してきついと感じたのは、罪人の道・高床村・王の手です。

罪人の道についてはエリートのボンバルディアとプロテクターの組合せが最悪です。初回の変異に第二の生を選択するため、タレットのクールタイムが長くなり、戦闘が長引きがちです。無理そうだと感じたら無視しましょう。

高床村についてはマスカー(煙を散布するやつ)とインクイジター,ウィーバーワーム(ワープしてくる赤いスライム)の組合せが凶悪です。タレットを展開し、注意しつつ進みましょう。

王の手については火力と体力がかなり上がっています。戦闘中は事故りやすいため、第二の生は必須です。ノーマル時と同様に、回避に集中しつつタレットに攻撃させましょう。

 

第一ステージについて

ハード以上の難易度では第一ステージの牢獄を駆け抜けることをおすすめします。

理由は以下の通りです。

  • インクイジターやボンバルディアといった厄介な敵がいる
  • 変異や装備が揃っておらず敵を倒すのに時間がかかる
  • マップが小さいため素早く巡回が可能

雑魚的やエリートは無視し、ショップや宝箱・スクロールを回収して第二ステージの時の扉(2分制限)に間に合うように巡回しましょう。ただ、スクロール持ちの敵(頭上に☆マークがある)がいた場合は倒しましょう。

各種装備の使用感

各装備についての個人的な使用感です。

 

氷の弓

超便利な弓。ダメージ軽減と凍結効果が強い。

 

氷のクロスボウ

氷の弓未入手の頃にアンロックした装備。弱い。

 

炎の焼印

かつては着火用に使用していた。使うと意外と強い。

 

電撃のムチ

自動照準で壁の中のアイテムを見つけてくれる。カミカゼの迎撃なども余裕でこなし、タレットの補助火力として便利。そしてかっこいい

 

盾全般

パリィが苦手なのでほとんど使ったことがない。ダメージ軽減目的で装備していたが氷の弓登場により使わなくなった。

 

斬腱の塔

多くの人が初めて使うであろうタレット。最序盤に使う程度である。

 

自動ダブルクロスボウ

たぶん最強のタレット。射程・仰角・連射力・視界が優れている。2つ展開すれば大抵の敵が溶ける。アンロックに必要なセル数が少なく、入手難易度が低いのもgood。

 

ヘヴィタレット

ロマン枠その1。高火力と火力バフが目を引くが自動ダブルクロスボウと比較すると小回りがきかない。

 

クラッシャー

ロマン枠その2。表記ダメージが高く敵によっては一方的に倒せるが使い勝手に難あり。

 

フジツボ

意外と便利で罪人の道でよく使う。対膨眼の魔物(辛苦の安置所のボス)として非常に優秀。

 

ウルフトラップ

強いと思うけど自動ダブルクロスボウ2つのほうが強いと思う。

 

アイスグレネード

強いと思うけど枠と変異の兼ね合いでタレットとは相容れない存在。

 

トニック

1ステージにつき1回使用可能なのが強い。使い捨てアイテムとしては非常に優秀であり高難易度の天上城あたりで拾えるとテンションが上がる。常備アイテムとして考えると、回復方法が限られる高難易度で使えると思うが、スキル枠を1つ潰す価値があるかは疑問である。スキル枠が1つ消えるため、タレットの火力が低下し道中・ボス戦ともにジリ貧になり被弾リスクが増加する。一方で火力を補うために近接攻撃型にすると敵に近づく必要があり被弾リスクが増加する。となるとやはりタレット2つでチキン戦法をとりつつ、温存した回復薬を使ってボス戦では短期決戦を狙うほうが全体的に楽だと思う。

サイコロをつくる

この記事はTCU-CTRL場外乱闘 Advent Calendar 2017 19日目の記事です。

備忘録でもあるので表現がくどいかもしれない。

やること

ロジスティック写像を使って6面サイコロを作ってみましょう。

下準備

\begin{align}
\label{eq:logistic} x_{t+1}=ax_{t}(1-x_{t})
\end{align} 
式\eqref{eq:logistic}のような漸化式をロジスティック写像と呼びます。 x_{t}は現時点の状態値を表します。写像に与える初期値 x_{0}は通常 0 \leq x_{0} \leq 1から選びます。また、 a=4のときに写像はカオス的な振る舞いをします。本記事では a=4とします。

さっそく式\eqref{eq:logistic}に代入してみましょう。以下、写像やロジスティック写像は式\eqref{eq:logistic4}を指します。
\begin{align}
\label{eq:logistic4} x_{t+1}=4x_{t}(1-x_{t})
\end{align}
式\eqref{eq:logistic4}は次のような特徴をもちます。

  • 決定論的:現在の状態 x_{t}から未来の状態 x_{t+1}が一意に定まる
  • 有界性:入力値 x_{t} 0 \leq x_{t} \leq 1ならば出力値 x_{t+1} 0 \leq x_{t+1} \leq 1となる
  • 非周期的:同じ値を繰り返さない
  • 初期値鋭敏依存性:異なる初期値に対してはまったく別の振舞いをする

つまりどういうことか

範囲[0,1]から適当に初期値をとってきてロジスティック写像を繰り返し適用すれば範囲[0,1]の値を重複なしでわりと無秩序に生成できる。乱数みたいだねすごいね。

サイコロをつくる

ロジスティック写像を使えば範囲[0,1]の値 x_{t}を得られる。区間[0,1]を6等分するような閾値を求め、各区間にサイコロの出目を割り当てればよさそうである。以下、 x_{t}に対応するサイコロの出目を y_{t}とする。

イメージとしては下の図のような感じです。

f:id:henceee:20171217000143p:plain:w400

f:id:henceee:20171214021624j:plain:w300

まだ理解できない大先輩のために具体例を示します。

  •  x_{t}=0.1919・・・\displaystyle \frac{1}{6} \leq x_{t} \lt \frac{2}{6} なので y_{t}=2
  •  x_{t}=0.810・・・\displaystyle \frac{4}{6} \leq x_{t} \lt \frac{5}{6} なので y_{t}=5
  •  x_{t}=1.14514・・・ 0 \leq x_{0} \leq 1ならこんなことは起きない





f:id:henceee:20171214021633j:plain:w300

完璧ですね。

数値実験

 初期値 x_{0}=0.114514とし、ロジスティック写像を100万回適用する。 x_{t} y_{t}に変換し、100万回中の出目1~6の出現回数を測定する。実験結果は以下の通りです。

出目 y_{t}
1
2
3
4
5
6
出現回数 269244 123692 108108 108273 123183 267500
割合(%) 26.9 12.3 10.8 10.8 12.3 26.7

はいうんこ
サイコロなのに出目に偏りがある。原因はなにか。なんでしょうね?

原因

原因はずばり確率密度関数にある。
ロジスティック写像によって得られる値の出現確率は式\eqref{eq:pkakuritu}の確率密度関数に従うことが知られている。
\begin{align}
\label{eq:pkakuritu} p(x)=\frac{1}{\pi \sqrt{x(1-x)}}
\end{align} 
式\eqref{eq:pkakuritu}の概形は以下の通りです。

f:id:henceee:20171210223458p:plain
式\eqref{eq:pkakuritu}の概形
形状からわかるように定義域の端ほど値が出現しやすく、中央に向かうにつれて出現しづらくなる。

つまりどういうことか

ロジスティック写像から得られる値の出現頻度に偏りがあるのでそのまま一様乱数として用いることはできない。

サイコロをつくる・その2

確率密度関数 p(x)を考慮し、改めて閾値を求める。
 p(x)確率密度関数であるならば定義域内の面積は1となる。一応確かめてみる。やっちまってくださいWolframAlpha兄貴。
www.wolframalpha.com
f:id:henceee:20171210231046g:plain
はいありがとうございます。問題なさそうです。

面積が1であることが確認できたので、この面積を6等分するような閾値を探す。具体的には以下の条件を満たすパラメータ a_{1}~a_{5}を探す。

\begin{align}
\label{eq:jk1} 0 \lt a_{1} \lt a_{2} \lt a_{3} \lt a_{4} \lt a_{5} \lt 1
\end{align} 


\begin{align}
\label{eq:jk2} \int_0^{a_{1}} p(x) dx = \int_{a_{1}}^{a_{2}} p(x) dx = \int_{a_{2}}^{a_{3}} p(x) dx = \int_{a_{3}}^{a_{4}} p(x) dx = \int_{a_{4}}^{a_{5}} p(x) dx = \int_{a_{5}}^{1} p(x) dx = \frac{1}{6}
\end{align}

くどいかもしれませんがイメージとしては下図のように確率密度関数の面積を6等分するパラメータです。色のついた部分の面積はそれぞれ \frac{1}{6}となります。
f:id:henceee:20171213165821p:plain

見つけました。詳細は補足を参照してください。

パラメータ  a_{1}  a_{2}  a_{3}  a_{4}  a_{5}
0.066 0.25 0.5 0.75 0.933

 x_{t}から y_{t}への変換は下図のようになる。
f:id:henceee:20171217000147p:plain:w400

なぜこんなことをするのか

いきなり確率密度関数とか言われてもしらねーよカスという人のためにガバガバ解説を載せときます。問題なさそうな人は飛ばしてください。

数値実験・その2

閾値 a_{1}~a_{5}を元に数値実験を行う。先ほどと同じく初期値 x_{0}=0.114514とし、ロジスティック写像を100万回適用した。実験結果は以下の通りです。

出目 y_{t}
1
2
3
4
5
6
出現回数 166340 168264 166440 166258 165635 167063
割合(%) 16.6 16.8 16.6 16.6 16.5 16.7

出目の出現回数がほぼ均等になっている。

無事ロジスティック写像によりサイコロの作成に成功し







f:id:henceee:20171211004020p:plain:w300

問題点


出現回数的には問題なさそうだが、実は出目の出現位置に問題がある。
意味不明なので具体例を示す。まずは下の表を見てもらいたい。

 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
27575 27872 27634 27662 27949 27987
2
27669 27607 27649 27961 27694 27526
3
27934 27568 27719 27816 27756 27694
4
27701 27729 27761 27602 27901 28084
5
28051 27550 27928 28021 27695 27867
6
27749 27780 27797 27716 28117 27678

これは一様乱数を用いて作成したサイコロを100万回振った際のデータである。行は t回目の出目、列は t+1回目の出目を表す。サイコロを100万回振った結果{ y_{1},y_{2},...,y_{1000000}}について隣接する2要素 y_{t} y_{t+1}の関係を調べた。例えば表内の赤文字をみると、2のあとに3が出た回数が27649回であったことがわかる。
値が均等に分散しているため、出目の間に相関性(「×が出た後は□がでやすい」といった傾向)がないことがわかる。

数値実験・その2では確率密度関数を6分割したことにより出目の出現回数が均等になったことを確認した。では出目の相関性はどうだったのか。調べた結果が以下の通りです。

 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
83338 83002 0 0 0 0
2
0 1214 83642 83408 0 0
3
0 0 0 0 83005 83435
4
0 0 0 0 82630 83628
5
0 0 82785 82850 0 0
6
83002 84047 13 0 0 0


f:id:henceee:20171213184854p:plain
尋常ではない結果となった。このサイコロでは1が出た直後は3~6が出ず、1か2が出るようだ。他の出目についても強い相関関係があるらしい。
原因はなんでしょうね?

原因

原因は式\eqref{eq:logistic4}のロジスティック写像にある。
簡単に言うと、ロジスティック写像では x_{t}が0付近の場合に x_{t+1}も0付近の値に、 x_{t}が1付近の場合に x_{t+1}は0付近の値になるといった特徴があり、前後する状態値は強い相関関係をもつ。 y_{t} x_{t}閾値 a_{1}~a_{5}によって単純に変換した値であるため、 x_{t} x_{t+1}の相関が y_{t} y_{t+1}にも影響する。この相関をどうにかしないとまともなサイコロとして機能しないわけである。

解決策

力技的な解決方法として出目の結果{ y_{1},y_{2},...y_{t}}をシャッフルするというものがある。乱数を生成するために乱数を用いるのである。これもうわかんねぇな

もう少しよさげな方法として x_{t+1}を離れたところから持ってくるというものがある。ロジスティック写像では写像を適用した回数が増えると相関が弱まることが知られている。具体的には x_{t} x_{t+1}には強い相関があるが、 x_{t} x_{t+100}の間に相関はほぼない。ならば x_{t+100} x_{t+1}として採用してしまえばよい。

ここで、関数 f^{n}(x_{t})を定義する。 f^{n}(x_{t})は引数の x_{t}にロジスティック写像 n回適用し結果 x_{t+n}を返す関数である。実装は再帰なりループなりでどうぞ。
こいつはこんな風に使う。

\begin{align}
\label{eq:logisticn} x_{t+1}=f^{n}(x_{t})
\end{align}

 nの値を調節することで2要素 x_{t} x_{t+1}の相関性を操作できるわけである。 nが小さいなら相関性は強く、大きいなら相関性は弱くなる。

数値実験・その3

相関性を考慮した実験を行った。初期値 x_{0}=0.114514とし閾値は数値実験・その2と同じく a_{1}~a_{5}を用いた。状態値の更新は式\eqref{eq:logisticn}の f^{n}(x_{t}により100万回行い、 n=2,5,10について調べた。
実験結果は以下の通りです。出目の出現回数は省きました。

  •  n=2
 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
41618 42225 41989 40417 0 0
2
0 0 0 1176 83275 83555
3
41496 41862 41181 41697 0 0
4
41321 42091 41460 41130 0 0
5
0 0 0 0 83373 83289
6
41814 41827 41606 41582 15 0
  •  n=5
 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
26009 26617 26029 26190 29728 31084
2
30854 31368 31470 31343 22149 20888
3
25998 26248 25845 25618 31217 31190
4
26074 26228 25844 26388 31330 31076
5
30788 31500 31210 31340 20716 20937
6
25934 26110 25719 26061 31351 31548
  •  n=10
 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
27722 27902 27344 27678 27749 27616
2
27641 28204 27972 27975 27934 28031
3
27544 28115 27732 27764 27620 27458
4
27733 27944 27868 27856 27707 27559
5
27530 27838 27720 27708 27967 28066
6
27841 27754 27597 27686 27852 27772




f:id:henceee:20171214001227j:plain
実験結果にご満悦の先輩


 nの値を増やすと x_{t} x_{t+1}の相関性が弱まり、出目 y_{t} y_{t+1}の相関も弱まるようだ。

結論

写像の適用回数を調節し、隣接する2つの要素 x_{t} x_{t+1}の相関性を弱めることができた。隣接する要素数が3つや4つの場合は未調査ですが、 n=50くらいにするといい感じの一様乱数になるそうです。
以上でロジスティック写像を用いてサイコロを作れたことにします。ここまでありがとうございました。

次回はジコリーニョ君です。よろしくお願いします。

補足


確率密度関数の面積を6等分するパラメータ a_{1}~a_{5}については数値積分により求めた。式\eqref{eq:pkakuritu}の p(x)の面積は1であるから、計算中の面積が \frac{1}{6}を超えた瞬間の x a_{1}に、 \frac{2}{6}を超えた瞬間の x a_{2}に割り当てるといった感じである。

蛇足

だが待ってほしい。本当にこれでいいのだろうか?

問題点

冒頭でロジスティック写像の特徴として非周期性(同じ値を繰り返さない)を紹介した。しかし現実では小数を有限桁で扱うため、写像が出力可能な値のパターンにも限りがあり周期が生まれてしまう。
話は変わるがさきほどは x_{t} x_{t+1}の相関をなくすために関数 f^{n}(x_{t})を用いた。初期値 x_{0}の更新に f^{10}(x_{t})を使うと、 x_{1}には x_{10}が、 x_{2}には x_{20}が割り当てられる。要するにこの方法では写像が出力可能なパターン数を n倍で消費してしまうわけである。
なんかもったいないと思いませんか?思いますよね。なのでここから先は nを小さくしつつ隣接する2要素 y_{t} y_{t+1}の相関性を弱める方法について検討します。

分割数の変更

下の画像を見てほしい。
f:id:henceee:20171213165821p:plainf:id:henceee:20171217000147p:plain:w400
現在のサイコロは式\eqref{eq:pkakuritu}の確率密度関数 p(x)を6分割する5つのパラメータ a_{1}~a_{5}について昇順にサイコロの出目{1~6}を割り当てている。だが p(x)の面積を6分割できているなら出目の割り当て順がどんなんであっても出目の出現回数は変わらないはずである。また領域が連続である必要もない。

意味不明なので具体例を示す。
 p(x)を12分割する11個のパラメータ a_{1}~a_{11}を下のような条件で定める。

\begin{align}
\label{eq:jk3} 0 \lt a_{1} \lt a_{2} \lt ... \lt a_{10} \lt a_{11} \lt 1
\end{align} 


\begin{align}
\label{eq:jk4} \int_0^{a_{1}} p(x) dx = \int_{a_{1}}^{a_{2}} p(x) dx = ... = \int_{a_{10}}^{a_{11}} p(x) dx = \int_{a_{11}}^{1} p(x) dx = \frac{1}{12}
\end{align}
この11個のパラメータについて下のようにサイコロの出目を割り当てる。
f:id:henceee:20171217000139p:plain

出目が1となるような x_{t}区間 [0,a_{1}) [a_{6},a_{7})である。では p(x)上でこの区間の和はどうなるのか。
\eqref{eq:jk4}から

\displaystyle \int_0^{a_{1}} p(x) dx + \int_{a_{6}}^{a_{7}} p(x) dx = \frac{1}{12} + \frac{1}{12} = \frac{1}{6}

他の出目についても区間の和は \frac{1}{6}となる。図のように1つの出目についての区間が不連続でも p(x)についての面積が等しいので各出目の出現回数は等しくなるはずだ。ここまでは先ほどの6分割と変わらない。何が変わったのか?

6分割の場合、出目が1となるのは x_{t}が0付近のときであり、出目が6となるのは x_{t}が1付近のときであった。しかし、12分割の場合は x_{t}が定義域 [0,1]の中心付近のときでも出目が1や6になる場合がある。つまり分割数を増やすほど、以前と比較して様々な区間に出目をばらまくことが可能となるわけである。

 x_{t} x_{t+1}を従来の6分割で y_{t} y_{t+1}に変換すると相関が残ってしまう。分割数を増やし、区間に対する出目の割り当て方を変更することで、 y_{t} y_{t+1}にある相関を弱めたいわけである。

出目の割り当て

ここでは2つの割り当て方法を紹介する。

1つ目は先ほどの12分割の画像のようにパラメータに対し昇順にサイコロの出目{1~6}を割り当てる方法である。この割り当て方法を通常割り当てと呼ぶことにする。

2つ目は乱数による割り当てであり、各パラメータに対してランダムにサイコロの出目{1~6}を割り当てる方法である。ランダムとはいえ各出目を割り当てる回数を揃えることで p(x)での面積が均一になり、出目の出現回数は等しくなる。この方法をランダム割り当てと呼ぶことにする。

結局乱数使ってるじゃねーかハゲという指摘もあると思うが乱数を用いるのはパラメータに対する出目の割り当てのみである。状態値の更新や y_{t}への変換では使用しないので多分レギュレーション違反ではないと思います。

数値実験・その4

分割数と割り当て方法の効果を確認する実験を行った。初期値 x_{0}=0.114514とし、状態値の更新はロジスティック写像により100万回行った。ロジスティック写像により更新を行うため、 x_{t} x_{t+1}の間には相関が残る。分割数は 6^{1},6^{2},6^{5}とし、それぞれ通常割り当てとランダム割り当てについて調査した。

  • 分割数 6^{1}、通常割り当て
 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
83338 83002 0 0 0 0
2
0 1214 83642 83408 0 0
3
0 0 0 0 83005 83435
4
0 0 0 0 82630 83628
5
0 0 82785 82850 0 0
6
83002 84047 13 0 0 0

当然だが以前と同じ結果である。ランダム割り当ては割愛します。

  • 分割数 6^{2}、通常割り当て
 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
41961 41835 0 0 41980 41513
2
0 0 83171 83329 0 0
3
41715 41575 0 0 41701 41717
4
42273 41525 0 0 41602 41277
5
0 0 83537 83348 0 0
6
41340 41564 0 0 41603 41433

分割数を増やしただけで多少はマシになった。

  • 分割数 6^{2}、ランダム割り当て
 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
0 27849 27635 41903 41938 27985
2
69895 14052 27671 27887 0 27448
3
27803 41970 14110 13809 41321 27388
4
28112 55328 55579 0 13765 13809
5
41500 13798 14018 27708 27774 41785
6
0 13956 27388 55287 41785 27743

だいぶマシになったがまだ0が存在する。

  • 分割数 6^{5}、通常割り当て
 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
41307 41613 0 0 41687 41350
2
0 0 83132 83378 0 0
3
41540 41304 0 0 41770 41770
4
41794 41979 0 0 41873 41597
5
0 0 83252 83865 0 0
6
41317 41614 0 0 41786 42071

分割数を増やすだけではあまり改善しない。

  • 分割数 6^{5}、ランダム割り当て
 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
29063 26831 28954 26837 28333 26328
2
24961 30363 28250 29894 26429 26461
3
29508 26861 26127 26012 29579 28203
4
28146 28696 28974 26768 26423 27448
5
25746 26592 26996 28067 28631 31016
6
28922 27015 26989 28877 27653 28046

分割数を増やし、ランダム割り当てを行うことで大幅に改善した。

まとめ

数値実験・その4では状態値の更新にロジスティック写像を使っている。これは状態値の更新に n=1とした関数 f^{n}(x_{t})を用いたのと同じ意味である。実験により、 n=1であっても確率密度関数の分割数を増やし、分割した区間に対してランダムにサイコロの出目を割り当てれば y_{t} y_{t+1}の相関を弱められることを確認した。

改善を確認したのはあくまで隣接する2つの要素 y_{t} y_{t+1}についてである。3つや4つの要素間には相関が残っているかもしれないしこの手法を用いても nの値は増やすべきだと思う。ただ nを増やす度合いはこちらのほうが少なくて済む気がする。

補足・その2

最良結果

実は 6^{7}分割の結果もある。載せる場所がないのでここに置いときます。
初期値 x_{0}=0.114514、状態値はロジスティック写像により100万回更新、出目はランダムに割り当てた。

 y_{t} \  y_{t+1}
1
2
3
4
5
6
1
27670 27848 27678 27730 27328 27750
2
27884 27466 27859 27950 27311 27859
3
27544 27883 28319 27928 27875 27673
4
27707 27878 27732 27459 27911 27802
5
27556 27537 28060 28022 27714 27764
6
27644 27717 27574 27400 28514 28453

結果だけみると一様乱数を用いたやつとあまり変わらないように見える。

計算量

ところで 6^{7}=279936である。確率密度関数 6^{7}分割するパラメータは a_{1}~a_{279935}の279935個であり、状態値 x_{t}が更新されるたびに x_{t}がどの区間に当てはまるかを計算する必要がある。
愚直にプログラムを組むと計算量は O(更新回数×分割数)となりなんだか時間がかかりそうである。だがパラメータは条件式\eqref{eq:jk1}のようにインデックスに従って昇順になっているから二分探索を用いることができる。
要するに何が言いたいかというと分割数が増えてもさほど問題はない。ただパラメータを配列で管理する必要があるためメモリがやばいかもれしない。

パラメータの求め方

さっきはパラメータを数値積分により求めたと説明したな。



f:id:henceee:20171218023453j:plain:w300

 6^{7}分割の場合は約28万個のパラメータが必要となる。これを数値積分により求めるのはしんどそうである。もう少し楽な方法を検討する。

確率密度関数 p(x)はこのような式であった。

\displaystyle p(x)=\frac{1}{\pi \sqrt{x(1-x)}}

とりあえず p(x)積分する。( logの底はeです) 
いつもありがとうございます、兄貴


f:id:henceee:20171217170639g:plain


積分定数を0とし右辺を P(x)とおく。つまり
\begin{align}
\label{eq:Px} P(x)=\frac{2 \sqrt{x-1} \sqrt{x} \log(\sqrt{x-1}+\sqrt{x})}{\pi \sqrt{-(x-1)x}}
\end{align} 
となる。
ここで P(x)の形状は下図のようになる。

f:id:henceee:20171217171620g:plain

図から P(0)=-1,P(1)=0であり、[0,1]では xが増加すると P(x)も増加する。
\displaystyle P(x)=- \frac{5}{6}を満たす x bとすると、 xが0からbに変化する間に P(x)\displaystyle -1から-\frac{5}{6}に、すなわち\displaystyle \frac{1}{6}だけ増加した。

 x:0→b P(x)の変化量の和が\displaystyle \frac{1}{6}であるため

\begin{align}
\label{eq:Pint} \int_0^{b} P'(x) dx = \frac{1}{6}
\end{align} 

となる。ここで、 p(x)積分したものが P(x)であるから P(x)微分 p(x)になる。

\begin{align}
\label{eq:Pin} \int_0^{b} p(x) dx = \frac{1}{6}
\end{align} 

つまり確率密度関数 p(x)の[0,b]の面積が\displaystyle \frac{1}{6}であることがわかる。

くどいようだがもう少し説明する。\displaystyle P(x)=- \frac{4}{6}となるような x cとすると、 x:b→c P(x)の変化量の和が\displaystyle \frac{1}{6}であるため

\begin{align}
\label{eq:pp} \int_b^{c} P'(x) dx = \frac{1}{6}
\end{align} 

となり、

\begin{align}
\label{eq:ppp} \int_b^{c} p(x) dx = \frac{1}{6}
\end{align} 

となる。つまり確率密度関数 p(x)の[b,c]の面積が\displaystyle \frac{1}{6}であることがわかる。

要するに\displaystyle P(x)=-\frac{5}{6},...,-\frac{1}{6}を満たす5つの xを見つければ、確率密度関数を6等分する閾値が求まるのである。\displaystyle P(x)=-\frac{35}{36},...,-\frac{1}{36}について解けば36等分、\displaystyle P(x)=-\frac{215}{216},...,-\frac{1}{216}について解けば216等分の閾値が求まる。

上記の方法は研究室の強い人たちに教えてもらった。改めて感謝する。

 P(x)についての方程式を解けば閾値(パラメータ)を求めることができるが、パラメータ数が増えると兄貴にいちいちコピー&ペーストするのが辛くなる。欲を言えば結果はファイルに出力してプログラムで使いたい。というわけで計算には学校で利用できるMathematicaを使用した。Mathematicaならプログラミングが可能であるため、 P(x)についての方程式をループで解いて結果をファイルに出力できる。

だがしかしうまくいかない。これは自分のMathematicaに関する知識不足が原因なのだが、分割数が増えると右辺の定数によっては方程式を解いてくれない場合がある。Mathematica乱闘対話すること数時間、結果として以下の式を得た。
\begin{align}
\label{eq:yyy} a_{k}=\frac{1}{4} (2+(-1)^{\frac{n-k}{n}}-(-1)^{\frac{k}{n}})
\end{align} 
式\eqref{eq:yyy}は確率密度関数 p(x) n等分する n-1個のパラメータ a_{k},(k=1,2,3,...,n-1)の一般項である。また、 0 \lt a_{k} \lt a_{k+1} \lt 1 ,(k=1,2,3...,n-2)となる。
多分 nが奇数でも偶数でも使えると思います。
本記事で用いた p(x)を分割するパラメータは全て\eqref{eq:yyy}により求めた。

以上で終わります。ここまでありがとうございました。