■
この記事はTCU-CTRL場外乱闘 Advent Calendar 2018 14日目の記事です。
13日の記事はこちらです。
うごメモの存在は知りませんでしたが、新サービスのうごメモが失敗した理由に、表現の幅が広がったこと(色は少ないほうがよかった)を挙げていたのが面白かったです。制限されていたほうが面白いものが作れるということなのでしょうか。文章を見るに、フォルティア氏もうごメモを作る側すなわちクリエイターだと思うのですが、作る側からこういった言葉が出るのはおもしろいですね。
去年書いた記事の補足と今年プレイしたゲームの感想を書きます。スペースを埋めるために司馬遼太郎の感想も書きます。
去年の補足
前回の記事ではロジスティック写像の確率密度関数を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}
の累乗が気持ち悪いのでなんとかします。
使うのはオイラーの公式です。
\begin{align}
\label{eq:eu1} e^{i \theta}=cos \theta + isin \theta
\end{align}
をぶち込むと有名なオイラーの等式になります。
\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}
先ほど式変形したは\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
普通におもしろい。ユニークな武器が多く、戦闘が楽しい。ファランの大剣で敵の集団に突っ込んで調子に乗り、侵入プレイヤーにパリィされて殺されるのはよくある話である。また、ボスが強い。ミディールはまじで頭おかしいと思う。
ラチェット&クランク THE GAME
初代作品のリメイクということでストーリーが大幅に変わりグラフィックが超絶進化した。PS2時代に1~3を狂ったように遊んだ身としては感慨深いものがあった。PS2時代でもグラフィックのきれいさに驚いたものだが、PS4版でも驚かされた。過去作を遊んでいるとニヤリとできるネタも多く、ファンサービスに満ちた作品であった。だが純粋なアクションゲームとしての楽しさは過去作には及ばない。ゲーム自体もボリューム不足感が残念だった。他作品リメイクの際には改善されていることを期待する。
ニーアオートマタ
稀代の尻ゲー。ストーリーはよくわからんかった。
モンスターハンターワールド
人生において初めてまともに取り組んだモンハンである。下位の初見アンジャナフが楽しさのピークだった。最近ではDLCに備えてちまちまプレイしている。慣れるとバゼルギウスが仲間に思える。受付嬢はうざい。ナナは死んどけ。
アンダーテール
求アズゴア弱化パッチ
司馬遼太郎の感想
今年になり司馬遼太郎の作品を読み始めた。きっかけは今年春の中国・大連への訪問である。帰国してなんとなく坂の上の雲を読み始めた。その後は項羽と劉邦、燃えよ剣を読んだ。以下簡単な感想。
坂の上の雲
明治維新後~日露戦争終結までを描いた作品である。作中で強く印象に残っているのはロシア帝国の腐敗である。普通ならば絶対に負けない戦争なのに、官僚が互いに足を引っ張りあうことであれほど状況が悪化するのは驚きである。また、戦闘描写もすさまじい。日本海海戦の緊張感は半端じゃない。戦艦同士が遠距離で徹甲弾を撃ち合うのだが榴弾と異なり目に見えて射撃の効果がわからないのである。測量機器も発達していないため、自軍の攻撃が有効なのかがわからない。しかし、敵軍の砲弾はこちらに命中し、甲板では死者が大量に出るのである。自軍が極端に不利な錯覚に陥りつつも、戦闘を継続する船員たちの精神力がすごい。まさしくこんな感じ
燃えよ剣
新選組の土方歳三の生涯を描いた作品である。全編にわたりやたらと文章がかっこいい。特に、新撰組内(土方歳三は佐幕派)から脱した伊東甲子太郎率いる倒幕派を粛正する際の文章がかっこいい。伊東の死体で敵7人をおびき寄せ、土方率いる新選組40人がリンチするシーンにおける文章である。伊東派7人のうち、4人は早々に逃げ生き延びたが、残り3人は死ぬまで戦った。
死んだのはすべて一流の使い手であった。かれらは脱出しようとしても、剣がそれをゆるさなかった。剣がひとりで動いてはつぎつぎと敵を斃し、死地へ死地へとその持ち主を追い込んで行った。
皮肉にも、この文章は晩年の土方歳三の運命を暗示している。もはや官軍の勢いを止められず、死ぬとわかっていても自分のプライドを優先して戦い続けたのである。
以上で終わります。ありがとうございました。
次回はうろん君です。よろしくお願いします。
Dead Cellsの個人的攻略法
Dead Cellsのノーマル難易度を攻略する上で重要だと思うことを書きます。
この記事を書いている時点(2018年6月現在)では王の手が最後のボスであるため、これを攻略することを目標とします。
回復薬やゴールド引継ぎ・ルーンなどの基本的なアップグレードはある程度済ませているものとします。
本記事では、おすすめの
- 攻略ルート
- 装備
- ビルド
- ボス戦での立ち回り
を紹介したいと思います。
攻略のコンセプトは設置系スキルの火力をあげて敵を速攻で倒すです。
戦闘は基本的にタレットに任せ、自分は安全な場所から攻撃します。近接型ビルドと比較すると爽快感に欠け、時間がかかるのが難点ですが安定した攻略が可能です。
攻略ルート
おすすめは以下のルートです。
罪人の道→牢獄の深部→納骨堂→高床村→時計塔→天上城
このルートの狙いは以下の通りです。
- 牢獄の深部・納骨堂ではゾンビ・スラッシャーを狩ることで自動ダブルクロスボウ・ヘヴィータレットのドロップを狙います。
- 全体的にボスや敵が弱いため攻略が容易です。
- エリートの出現率が高いため、良質のアミュレットを拾いやすいです。
道中のエリートは全て倒します。タレットが強いのでなんとかなると思います。
装備
武器編
武器の中では電撃のムチが実用性・入手性ともに優れていておすすめです。金色装備でなくても十分強力なので使いましょう。ムチは火力が低いため不満に思う方もいるかもしれまんせんが、盾持ちやカミカゼへの対処、段差の上からタコ殴りにする際に使用するなど、タレットの補助火力として使用するため問題ありません。
もう片方の武器は氷の弓がおすすめです。手軽に凍結させられる上に、装備に被ダメージ減の効果がつくため便利です。
氷の弓をアンロックしていない場合は盾or適当な金色装備がおすすめです。盾を使用する場合は被ダメージ減の効果がついたものを使いましょう。金色装備はスクロール狙いで使います。両方ともお守りとして持っているだけでいいと思います。
スキル編
スキルは設置系タレットの自動ダブルクロスボウ(ゾンビがドロップ)が非常に強力です。これを2つ持ちましょう。自動ダブルクロスボウが手に入るまでは適当な設置系のスキルで凌ぎましょう。
オプション
装備のオプションはシナジーを意識しましょう。おすすめは毒or炎上を中心とした効果です。
以下強化例:
残りは適当なもので大丈夫です。ただし、与ダメージ・被ダメージが共に増加するオプションは事故りやすいので避けましょう。
氷の弓に関しては装弾数が4発と少ないため、貫通効果がつくと心強いです。
装備レベル
道中はあまり気にしなくても大丈夫ですが、現在よりも高レベルのベースが見つかった場合は乗り換えましょう。天上城をクリアした時点で各装備がレベル5くらいあるといいと思います。
ビルド
スクロール
スクロールはタレット・ムチの火力に直結する戦術を中心に強化します。天空城をクリアした時点で装備の補正込みで戦術が15以上あるといいと思います。残りは赤と緑に均等に振ってHPを伸ばしましょう。
呪い
戦術を強化しつつHPを確保するためにも道中の呪われた宝箱は積極的に開けましょう。ただし、時計塔以降は被弾しやすいため、宝箱を開けるのは高床村までにしたほうがいいと思います。また、ゴールドが足りない場合は呪い覚悟で扉を破壊しましょう。
呪いを受ける前はエリアの攻略状況を確認しましょう。特に、ボス戦前に呪いを受け、敵の数が足らず解呪できないと悲惨なことになるので注意しましょう。
ミューテーション
おすすめの順番は以下の通りです。
熟練→ネクロマンシー→サポート→(天上城クリア時にリセット)→熟練・サポート・デッドインサイド
各スキルについて説明します。
- 熟練:タレットの回転率と火力を上げて効率的にステージを攻略できる。
- ネクロマンシー:道中で使用。HPが地味に回復する。
- サポート:タレット付近からムチで攻撃する。意外と強い。
- デッドインサイド:ボス戦ではネクロマンシーの意味がないためこちらを使う。
天上城をクリアした時にデッドインサイドを覚えるため、HPが大きく伸びます。目安としては、王の手前に8000以上あると事故死しづらくなります。
第二の生を使う場合は下のような取得順序になると思います。
第二の生→熟練→デッドインサイド
ただ、この場合は熟練の取得が遅れるためタレットの回転率が落ち、第二ステージ攻略が若干しんどくなります。
ボス戦での立ち回り
- タレットを設置する
- ローリングなどで攻撃を避ける
- いけそうならムチで攻撃する
- 1に戻る
以下注意点
- 回復は早めに飲む。
- タレットの近くにいるとサポートの恩恵を受けられるのでできれば近くにいる。
- 無理して攻撃しない。攻撃は基本的にタレットにやらせる。
- 盾は必ずしも使う必要はない。パリィを狙って被弾するほうが危険。
逃げつつも火力でゴリ押しして回復が尽きる前に倒します。
最後に
初見で王の手と戦った際は為す術もなく殺されましたが、タレットを中心とした戦法を採用することで、下手糞な自分でも最近は安定して勝てるようになりました。
本記事が攻略の参考になれば幸いです。
追記
ハードモード攻略しました。
スクロールの出が悪く、HPや火力が伸び悩みましたが意外といけました。
ベリーハード攻略時の装備はこんな感じでした。
エキスパート攻略時の装備です。
序盤に「セルと一緒にゴールドも得る」の効果がついたアミュレットを入手しないと装備の強化や回復薬の購入が難しく厳しいです。
ナイトメア攻略時の装備です。
初回の変異を第二の生にしました。
ナイトメア攻略について
ナイトメアを攻略する上で重要だと思うのは以下の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}のような漸化式をロジスティック写像と呼びます。は現時点の状態値を表します。写像に与える初期値は通常から選びます。また、のときに写像はカオス的な振る舞いをします。本記事ではとします。
さっそく式\eqref{eq:logistic}に代入してみましょう。以下、写像やロジスティック写像は式\eqref{eq:logistic4}を指します。
\begin{align}
\label{eq:logistic4} x_{t+1}=4x_{t}(1-x_{t})
\end{align}
式\eqref{eq:logistic4}は次のような特徴をもちます。
- 決定論的:現在の状態から未来の状態が一意に定まる
- 有界性:入力値がならば出力値はとなる
- 非周期的:同じ値を繰り返さない
- 初期値鋭敏依存性:異なる初期値に対してはまったく別の振舞いをする
つまりどういうことか
範囲[0,1]から適当に初期値をとってきてロジスティック写像を繰り返し適用すれば範囲[0,1]の値を重複なしでわりと無秩序に生成できる。乱数みたいだねすごいね。
サイコロをつくる
ロジスティック写像を使えば範囲[0,1]の値を得られる。区間[0,1]を6等分するような閾値を求め、各区間にサイコロの出目を割り当てればよさそうである。以下、に対応するサイコロの出目をとする。
イメージとしては下の図のような感じです。
まだ理解できない大先輩のために具体例を示します。
- ・・・ なので
- ・・・ なので
- ・・・ならこんなことは起きない
完璧ですね。
数値実験
初期値とし、ロジスティック写像を100万回適用する。をに変換し、100万回中の出目1~6の出現回数を測定する。実験結果は以下の通りです。
出目 | 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}の概形は以下の通りです。形状からわかるように定義域の端ほど値が出現しやすく、中央に向かうにつれて出現しづらくなる。
つまりどういうことか
ロジスティック写像から得られる値の出現頻度に偏りがあるのでそのまま一様乱数として用いることはできない。
サイコロをつくる・その2
確率密度関数を考慮し、改めて閾値を求める。
が確率密度関数であるならば定義域内の面積は1となる。一応確かめてみる。やっちまってくださいWolframAlpha兄貴。
www.wolframalpha.com
はいありがとうございます。問題なさそうです。
面積が1であることが確認できたので、この面積を6等分するような閾値を探す。具体的には以下の条件を満たすパラメータを探す。
\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等分するパラメータです。色のついた部分の面積はそれぞれとなります。
見つけました。詳細は補足を参照してください。
パラメータ | |||||
---|---|---|---|---|---|
値 | 0.066 | 0.25 | 0.5 | 0.75 | 0.933 |
からへの変換は下図のようになる。
数値実験・その2
閾値を元に数値実験を行う。先ほどと同じく初期値とし、ロジスティック写像を100万回適用した。実験結果は以下の通りです。
出目 | 1 |
2 |
3 |
4 |
5 |
6 |
---|---|---|---|---|---|---|
出現回数 | 166340 | 168264 | 166440 | 166258 | 165635 | 167063 |
割合(%) | 16.6 | 16.8 | 16.6 | 16.6 | 16.5 | 16.7 |
出目の出現回数がほぼ均等になっている。
無事ロジスティック写像によりサイコロの作成に成功し
問題点
出現回数的には問題なさそうだが、実は出目の出現位置に問題がある。
意味不明なので具体例を示す。まずは下の表を見てもらいたい。
\ | 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万回振った際のデータである。行は回目の出目、列は回目の出目を表す。サイコロを100万回振った結果{}について隣接する2要素との関係を調べた。例えば表内の赤文字をみると、2のあとに3が出た回数が27649回であったことがわかる。
値が均等に分散しているため、出目の間に相関性(「×が出た後は□がでやすい」といった傾向)がないことがわかる。
数値実験・その2では確率密度関数を6分割したことにより出目の出現回数が均等になったことを確認した。では出目の相関性はどうだったのか。調べた結果が以下の通りです。
\ | 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 |
原因はなんでしょうね?
原因
原因は式\eqref{eq:logistic4}のロジスティック写像にある。
簡単に言うと、ロジスティック写像ではが0付近の場合にも0付近の値に、が1付近の場合には0付近の値になるといった特徴があり、前後する状態値は強い相関関係をもつ。はを閾値によって単純に変換した値であるため、との相関がとにも影響する。この相関をどうにかしないとまともなサイコロとして機能しないわけである。
解決策
力技的な解決方法として出目の結果{}をシャッフルするというものがある。乱数を生成するために乱数を用いるのである。これもうわかんねぇな
もう少しよさげな方法としてを離れたところから持ってくるというものがある。ロジスティック写像では写像を適用した回数が増えると相関が弱まることが知られている。具体的にはとには強い相関があるが、との間に相関はほぼない。ならばをとして採用してしまえばよい。
ここで、関数を定義する。は引数のにロジスティック写像を回適用し結果を返す関数である。実装は再帰なりループなりでどうぞ。
こいつはこんな風に使う。
\begin{align}
\label{eq:logisticn} x_{t+1}=f^{n}(x_{t})
\end{align}
の値を調節することで2要素との相関性を操作できるわけである。が小さいなら相関性は強く、大きいなら相関性は弱くなる。
数値実験・その3
相関性を考慮した実験を行った。初期値とし閾値は数値実験・その2と同じくを用いた。状態値の更新は式\eqref{eq:logisticn}のにより100万回行い、について調べた。
実験結果は以下の通りです。出目の出現回数は省きました。
\ | 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 |
\ | 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 |
\ | 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 |
の値を増やすととの相関性が弱まり、出目との相関も弱まるようだ。
結論
写像の適用回数を調節し、隣接する2つの要素との相関性を弱めることができた。隣接する要素数が3つや4つの場合は未調査ですが、くらいにするといい感じの一様乱数になるそうです。
以上でロジスティック写像を用いてサイコロを作れたことにします。ここまでありがとうございました。
次回はジコリーニョ君です。よろしくお願いします。
補足
確率密度関数の面積を6等分するパラメータについては数値積分により求めた。式\eqref{eq:pkakuritu}のの面積は1であるから、計算中の面積がを超えた瞬間のをに、を超えた瞬間のをに割り当てるといった感じである。
蛇足
だが待ってほしい。本当にこれでいいのだろうか?
問題点
冒頭でロジスティック写像の特徴として非周期性(同じ値を繰り返さない)を紹介した。しかし現実では小数を有限桁で扱うため、写像が出力可能な値のパターンにも限りがあり周期が生まれてしまう。
話は変わるがさきほどはとの相関をなくすために関数を用いた。初期値の更新にを使うと、にはが、にはが割り当てられる。要するにこの方法では写像が出力可能なパターン数を倍で消費してしまうわけである。
なんかもったいないと思いませんか?思いますよね。なのでここから先はを小さくしつつ隣接する2要素との相関性を弱める方法について検討します。
分割数の変更
下の画像を見てほしい。
現在のサイコロは式\eqref{eq:pkakuritu}の確率密度関数を6分割する5つのパラメータについて昇順にサイコロの出目{1~6}を割り当てている。だがの面積を6分割できているなら出目の割り当て順がどんなんであっても出目の出現回数は変わらないはずである。また領域が連続である必要もない。
意味不明なので具体例を示す。
を12分割する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}
出目が1となるようなの区間はとである。では上でこの区間の和はどうなるのか。
\eqref{eq:jk4}から
他の出目についても区間の和はとなる。図のように1つの出目についての区間が不連続でもについての面積が等しいので各出目の出現回数は等しくなるはずだ。ここまでは先ほどの6分割と変わらない。何が変わったのか?
6分割の場合、出目が1となるのはが0付近のときであり、出目が6となるのはが1付近のときであった。しかし、12分割の場合はが定義域の中心付近のときでも出目が1や6になる場合がある。つまり分割数を増やすほど、以前と比較して様々な区間に出目をばらまくことが可能となるわけである。
とを従来の6分割でとに変換すると相関が残ってしまう。分割数を増やし、区間に対する出目の割り当て方を変更することで、とにある相関を弱めたいわけである。
出目の割り当て
ここでは2つの割り当て方法を紹介する。
1つ目は先ほどの12分割の画像のようにパラメータに対し昇順にサイコロの出目{1~6}を割り当てる方法である。この割り当て方法を通常割り当てと呼ぶことにする。
2つ目は乱数による割り当てであり、各パラメータに対してランダムにサイコロの出目{1~6}を割り当てる方法である。ランダムとはいえ各出目を割り当てる回数を揃えることででの面積が均一になり、出目の出現回数は等しくなる。この方法をランダム割り当てと呼ぶことにする。
結局乱数使ってるじゃねーかハゲという指摘もあると思うが乱数を用いるのはパラメータに対する出目の割り当てのみである。状態値の更新やへの変換では使用しないので多分レギュレーション違反ではないと思います。
数値実験・その4
分割数と割り当て方法の効果を確認する実験を行った。初期値とし、状態値の更新はロジスティック写像により100万回行った。ロジスティック写像により更新を行うため、との間には相関が残る。分割数はとし、それぞれ通常割り当てとランダム割り当てについて調査した。
- 分割数、通常割り当て
\ | 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 |
当然だが以前と同じ結果である。ランダム割り当ては割愛します。
- 分割数、通常割り当て
\ | 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 |
分割数を増やしただけで多少はマシになった。
- 分割数、ランダム割り当て
\ | 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が存在する。
- 分割数、通常割り当て
\ | 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 |
分割数を増やすだけではあまり改善しない。
- 分割数、ランダム割り当て
\ | 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では状態値の更新にロジスティック写像を使っている。これは状態値の更新にとした関数を用いたのと同じ意味である。実験により、であっても確率密度関数の分割数を増やし、分割した区間に対してランダムにサイコロの出目を割り当てればとの相関を弱められることを確認した。
改善を確認したのはあくまで隣接する2つの要素とについてである。3つや4つの要素間には相関が残っているかもしれないしこの手法を用いてもの値は増やすべきだと思う。ただを増やす度合いはこちらのほうが少なくて済む気がする。
補足・その2
最良結果
実は分割の結果もある。載せる場所がないのでここに置いときます。
初期値、状態値はロジスティック写像により100万回更新、出目はランダムに割り当てた。
\ | 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 |
結果だけみると一様乱数を用いたやつとあまり変わらないように見える。
計算量
ところでである。確率密度関数を分割するパラメータはの279935個であり、状態値が更新されるたびにがどの区間に当てはまるかを計算する必要がある。
愚直にプログラムを組むと計算量はとなりなんだか時間がかかりそうである。だがパラメータは条件式\eqref{eq:jk1}のようにインデックスに従って昇順になっているから二分探索を用いることができる。
要するに何が言いたいかというと分割数が増えてもさほど問題はない。ただパラメータを配列で管理する必要があるためメモリがやばいかもれしない。
パラメータの求め方
分割の場合は約28万個のパラメータが必要となる。これを数値積分により求めるのはしんどそうである。もう少し楽な方法を検討する。
確率密度関数はこのような式であった。
とりあえずを積分する。()
いつもありがとうございます、兄貴
積分定数を0とし右辺をとおく。つまり
\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}
となる。
ここでの形状は下図のようになる。
図からであり、[0,1]ではが増加するとも増加する。
を満たすをとすると、に変化する間にはに、すなわちだけ増加した。
での変化量の和がであるため
\begin{align}
\label{eq:Pint} \int_0^{b} P'(x) dx = \frac{1}{6}
\end{align}
\begin{align}
\label{eq:Pin} \int_0^{b} p(x) dx = \frac{1}{6}
\end{align}
つまり確率密度関数の[0,b]の面積がであることがわかる。
くどいようだがもう少し説明する。となるようなをとすると、での変化量の和がであるため
\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}
となる。つまり確率密度関数の[b,c]の面積がであることがわかる。
要するにを満たす5つのを見つければ、確率密度関数を6等分する閾値が求まるのである。について解けば36等分、について解けば216等分の閾値が求まる。
上記の方法は研究室の強い人たちに教えてもらった。改めて感謝する。
についての方程式を解けば閾値(パラメータ)を求めることができるが、パラメータ数が増えると兄貴にいちいちコピー&ペーストするのが辛くなる。欲を言えば結果はファイルに出力してプログラムで使いたい。というわけで計算には学校で利用できるMathematicaを使用した。Mathematicaならプログラミングが可能であるため、についての方程式をループで解いて結果をファイルに出力できる。
だがしかしうまくいかない。これは自分の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}は確率密度関数を等分する個のパラメータの一般項である。また、となる。
多分が奇数でも偶数でも使えると思います。
本記事で用いたを分割するパラメータは全て\eqref{eq:yyy}により求めた。
以上で終わります。ここまでありがとうございました。