ドラゴンクエスト掲示板> 現行ログ> No.1305

ドラゴンクエスト掲示板(質問回答・情報の交換投稿・要望・間違い指摘)

No.1305-0 右弐 [リンク] 2013/06/22(Sat)02:51
[DQ5]関連研究での引用のお礼:スロット完全攻略
管理人様へ
PS2版ドラクエ5での「スロット完全攻略」のページで公開された技について、その後も研究がすすめられていました。
昨年になりますが、私もその研究内容を公開するにあたり、該当のページの乱数の利用と、原理の説明としてリンクを貼らせていただいています。
事後報告になってしまい恐縮ですが、改めてお礼申し上げます。
2012年には5000回転までの出目乱数が解析され、大当たりは31個まで判明しています。
No.1305-1 miya 2013/06/22(Sat)20:00
ご連絡ありがとうございます。
大まかにですが拝見させていただきました。
当時から注目されていましたが「77777」は未だに確認されてないんですね。
仮に乱数が2^24個もあるならその中には存在しそうですが発見は難しいということでしょうか。

ちょっと気になった点もありました。
私のページには意図的に作られたという文面はありますがその理由が真意と異なっています。
攻略で使用する部分の配当が多過ぎることは理由だと考えていませんし、使用されているであろう乱数生成の計算式も単に引数に戻り値を返すだけでそこに作為はないと考えています。

先ず意図的と感じる理由として、乱数の初期番手をランダムな選択にするだけで全く攻略できないものになっていたはずなのに、なぜファミコン時代のような構成を採用したのか経緯が不可解です。
また、乱数の不使用時に先送りされる約1/30秒というタイミングも1/300秒くらいなら攻略の発見は遅れていたでしょうし、発見されても役に立たないものになっていた可能性もあります。
妙に使い勝手が良い値であることにむしろ違和感があります。

想像されることとして、リールの図柄配列は役の出現率と配当のバランス内で自由な並びが作れるので、何通りも試作しては結果を出力させて、都合が良い当たりの集中が出現するものを選定した可能性が考えられます。
ただしリール配列の工夫だけではセーブポイントから歩いて丁度になるはずもなく、仮に2^24番中の200万番目を使用するなら199万9600番からカウントを開始するなどの調整も必要だったはずです。
その際の乱数のカウントはゲームソフトのロード後ではなくセーブデータのロード後に開始することも必要事項です。

以上のように図柄配列、乱数カウントの初期値、開始時期、速度などの様々な要素を適度に調節して「いつか誰かが攻略に臨むように企画した」というのが私の考えです。
No.1305-2 右弐 2013/06/24(Mon)23:01
レスポンスいただき、ありがとうございます。

まず、「意図的」についての真意、誤解がありすみません。
丁寧にご指摘いただき、ありがとうございます。

私は、miyaさんが、
 × 「当たりの密度が計算上より濃すぎる」ことから「意図的」と判断された
という推測をしていました。これはmiyaさんの真意と異なっており、正しくは、
 ○ 「当たりの密度の濃い部分が、ロード直後のタイミングに存在する不自然さ」を「意図的」と表現された
という理解でよろしいでしょうか。

また、miyaさんの想定する製作者側の思考は、次のようなものでしょうか。
1.スロットでコインを増やすために、セーブ&ロード繰り返すプレイヤーが出現するだろう
2.そうした状況下で、効率的な攻略法が見つかってもよい
3.そのために、ロードからすぐのタイミングで当たるようにし、あえて解析しやすい仕様にしておこう
上記2の部分には「不毛なリセット作業を不要にする技が発見されてもいい」という製作者の意図も垣間見える。

この理解でよろしければ、私の該当ページに加筆訂正として加えさせていただきます。
ここまで誤解を招くとともに、お手数かけて申し訳ありません。
No.1305-3 miya 2013/06/25(Tue)02:45
×○も1,2,3も大体その通りです。
ただ、メーカーの姿勢は「見つかってもよい」といった消極的なものではなく、見つけること自体を楽しめるようにというスタンスで企画設計したと考えています。
と言っても状況証拠しかないので飽くまでも想像の域なんですが、取り合えず私が意図的と表現したのは出目の偏りのことではなくメーカーのスタンスです。
No.1305-4 右弐 [リンク] 2013/06/25(Tue)23:39
ありがとうございます。
該当部分を訂正させていただきましたので、
お時間があるときに、リンク先からご確認いただけるとありがたいです。
No.1305-5 miya 2013/06/27(Thu)02:24
追記ありがとうございます。

ところで乱数の規模を模索されたことはあるでしょうか?
前レスで例として挙げた2^24個という数字だと少々大袈裟に感じられるかもしれませんが、私はこのあたりではないかと考えています。

リールの向きの組み合わせは16^5種類(2^20種類)あります。
仮にランダムに2^20回転させると重複が生じてリール組み合わせの37%ほどが出現しません。
全ての目の出現が必要なわけではないですが、仮に全て出現させるのに必要な回転数の期待値を計算してみると1500万回転とちょっととなり、これが丁度2^24に匹敵します。

5000回転のデータが検索できるなら完全な繰り返しを確認できそうな気がしますね。
2^24だと1/30秒で消化させても6日以上かかってしまいますが2^20なら9時間40分ほどで到達します。
必ずしも2のべき乗とは限らないので色々試すことになってしまいそうではありますが…
No.1305-6 右弐 2013/06/28(Fri)00:25
ご確認ありがとうございます。
やっとお話できる状況が作れ、ほっとしています、苦笑

確かに、「77777」が発見されていないだけなのか、そもそも出目として存在していないのか、という問いは現時点としては「わからない」という状況です。

ただ、私は「存在している」と信じたい派です。
乱数生成に詳しくはないのですが、ループは存在しないのではないかと考えているためです。無理数の数字の並びのイメージで、「有限の出目だけど、循環しない」という形はありえないでしょうか。乱数生成に三角関数を使っているような例もあるようです。
※三角関数を使っている例の紹介(にゅすけ氏の日記)
 http://nyusuke.com/column/gamediary/log5A.html#20111114

仮に乱数がループするなら、miyaさんのおっしゃるように規模で「77777」など任意の出目の存在確率が決まるというのは理解しています。
ただ、特定するとなるとおっしゃる通り、2^20とか2^24とか、ループの周期を仮定して当てに行かないといけないので、製作者側が意図的に仕込んでいない限りは難しそうです。ぜんぶベタっと調べようとすると、2^20でも23日かかります。

miyaさんのおっしゃるのは、(以下2^20=n とおきます)
・n個の出目内に、ある特定の出目が存在しない確率 = 1/e=37%
・すべての出目が出るまでの回数の期待値 = nΣ1/k → n・log(n)=2^24
と認識していますが、2^24くらいでループになるということは、製作者側が「一応全部の出目が出そうな設定しておこう」という意図がない限り、実現されそうにもないですよね。

ここの部分の「製作者の意図的なパラメータ微調整の存在」に関しては、私はどちらかというと否定的にとらえています。というより、そういう考え方が私の中になかったです。miyaさんの真意は私の思考の一段上のレベルで展開されており、そのため私は正しく理解できなかったと思っています。と同時に、理解したとき夢がある話だと思い少なからず感動しました。
miyaさんの指摘する単純作業を軽減する「製作者の善意の意図」が存在すれば素晴らしいです。ですから、私は私の「否定的なとらえかた」が間違っていることに期待しています。しかしどうもこのゲームのほかの部分を見ていると、期待しにくいと思ってしまうのが現状です。
No.1305-7 miya 2013/06/28(Fri)04:37
全ての目が出るのに必要な回転数はクーポンコレクターの問題という算出方法で求められます。
2^24種類を計算するなら何か自動処理する方法を考える必要がありますが。

乱数生成を熟知してるわけではないですが再現性があって循環しない方法はないと思います。
算術がどんな方法だとしても何番目かを特定するのに必ず量的な限界が伴うので、最大でもその限界に達した次の1手は初期に戻す以外に方法がないはずです。

乱数の規模を調査する場合には先頭から調査すると能率が上がりません。
やるならスロットの前で6日と11時間20分放置してから出目を確認するなどの方法が良いと思います。
これは1/30秒で2^24をカウントする時間の長さです。
先ずは見当を付けた長い時間の調査で何とかヒットする例を見つけて、次にその時間を素数で割った長さを調査するほうが効率的でしょう。

実際には6日11時間10分あたりから2分置きに覗いてみるような方法になるでしょうか。
なかなか上手くヒットするものではないとは思いますが。

メーカーはこのスロットを設計する際に攻略できるようにもできないようにも作れたと思います。
企画会議でどちらにするか検討を行った上でできるようにした、くらいに私は考えているので、隙を突いて独特な攻略方法を構築したという意識は全くなく、飽くまでもメーカーが敷いたレールの上を走ったのがたまたま私だったという感覚です。
No.1305-8 右弐 2013/06/29(Sat)01:07
コメントありがとうございます。勉強になります。

1.全ての目が出るのに必要な回転数
すべての出目が出そろうと保証できることは延々ないと思いますので、ここでいう回転数は「期待値」という意味でよろしいでしょうか。
そうすると、そこまで正確に推測しなくてもいいかと思い、
 log(n+1) <  Σ1/k  < 1 + log(n)
からだいたい n・log(n) と考えると、miyaさんの2^24と合うなと判断していました。
もしや、コンピュータの乱数列だと「すべての出目が出そろうと保証できる」ことがありうるのでしょうか。

2.乱数の循環
miyaさんのおっしゃる通り、循環すると理解しました。
seedとして投げ込むデータ型が有限なので、どんな生成ルーチンを使おうが関係ないですね。
データの型として考えると、なぜmiyaさんが2の累乗で規模を推定しているのか、やっとわかりました。頭の中でいろいろつながりました。
データ型で考えるなら、2バイト、2^16でループする可能性もなきにしもあらずかと思います。1時間仕事なので、少し調査してみようと思います。

3.2分おきというのはなぜでしょうか
現状での5000回転までの出目表は25000乱数、13分程度に相当するので、10分に1回のぞく、という頻度でもヒットさせられると思ったのですが、2分というのは、別の何か意味がある値なのでしょうか。


4.メーカーの意図について
最初にご返信いただいた時の指摘についてですが、私は以下のように考えています。
・リールの絵柄 : スーファミと同じなので、調整の形跡はない
・乱数の初期がランダムでない :
 ローテーションのボスで、2つの行動から選ぶ仕様にもかかわらず、
 1ターン目の行動のみが確定しているという現象があります。
  雪の女王:打撃  イブール:輝く息
 意図的にこんな調整をする理由は思い浮かびません。
 スロットも、これと同じ系統の現象に分類していました。
 また、スロットは、戦闘を起こすと見たこともない出目になりますが、
 これは初期乱数が正しくセットしなおされたと解釈しています。
・1/30秒という速度 : 1/60秒というフレームレートを基準としているだけ
・開始時期の調整 : 
 miyaさんの真意を知って改めて考えると、 ロード直後の、19→58→123 の当たりは
 すべてパターン1なので、ただ回しているだけで1/5の確率で3連発の当たりを目にします。
 他の多くの当たりと比較しても、確かに偶然にしては出来過ぎていると私も思います。

まとめると、私は「開始時期の調整」だけはメーカーの意図として行われたかもしれないと思っています。
No.1305-9 miya 2013/06/29(Sat)11:16
>1について
全ての目が出るのに必要な回転数は数学的に期待値を考えただけで、目が出揃うことが確定するようなものではありません。

例えばサイコロの目6種を全て出すのに必要な試行回数の平均は次のように求められます。
6/6+6/5+6/4+6/3+6/2+6/1=14.7回

簡単に解説すると、まだ出てない目が出現する確率の逆数の合計です。
仰るように正確に求める必要はないことですが、参考にするための理論値として16^5種類を計算してみると1500万あまりで2^24に近い値であることが分かります。

>3について
5000回転は乱数2万5千個のことなんですね。
乱数5000個だと思っていたので2分と考えましたが10分間隔でいいと思います。
それにしても随分と調べたもんですね。
それだけあれば規模の調査もかなり期待できる気がします。

>その他
そう言えば図柄配列がSFCと同じというのは当時にも聞いた覚えがありました。
変更が加えられたのは出目の生成方法だけですね。

戦闘中は攻撃の当たり外れや会心、ダメージや回復の振り幅や状態変化などの随所に乱数が使われます。
敵の行動はパターンが移行する際に確率選択としてその乱数の続きが使われると考えるほうが現実的だと思います。
1ターン目の行動が固定されてる敵は乱数の使用箇所が決まっているのではなく確率選択を行ってないだけではないでしょうか。

戦闘後の出目については調べてみないと実感が湧きませんが、例えば戦闘に入ると乱数のカウントが数万プラスされるとか、通常時は+1ずつだけど戦闘中は+200になるなど原因になりそうなことは様々考えられます。
ただカウントがリセットされるよりは既知データの先に進んでしまってる可能性のほうが高い気がします。
No.1305-10 右弐 2013/06/29(Sat)14:20
>>1について
やっぱり出揃う保証は無理ですよね。ありがとうございます。
「まだ出てない目が出現する確率の逆数の合計」というのは理解しています。その先の計算は適当にサボっていいのか、という確認でした。たとえば、サイコロだと、
6/6+6/5+6/4+6/3+6/2+6/1 = 6×(1/1+1/2+1/3+1/4+1/5+1/6) = 6×Σ1/k (k=1から6)
とでき、このΣ1/kの部分の数値として、「幅1、高さ1/1,1/2,1/3,・・・,1/6の6本の棒グラフの面積の和」と考えるなら、関数 y=1/x と y=1/(x+1) のグラフの面積は積分で処理できるので、nが非常に大きいなら推定に使えます。

>>3について
やはりそうでしたか。ありがとうございます。
5000回転までは、そうこさん・御茶麒麟さん、の両氏が調査されました。miyaさんが仰るように、このデータ量は他の調査を加速させる足がかりになっています。
私が発見したことだと、乱数の速度は1/30秒ではなく、待ち時間の環境において少なくとも3パターンあります。ですがこれもデータが増えてなければ気付かなかったと思います。
ロード→戦闘→スロット、とした場合の出目も、5000回転までにはヒットしないことを確認しています。

>戦闘について
調査で以下の2つは確認しています。
・単に乱数が消費されていると考えるには消費量が多すぎる
・ロード→戦闘→すぐ逃げ→スロット、とした場合の出目同士を比較した場合に、再現は稀
このため、私はseedの再設定のような「横のズレ」が濃厚かと思っていました。

さらに、戦闘がリセットのかわりになるのではないかとも思い、延々と「戦闘→すぐ逃げ→スロット→・・・」とループして調査しましたが、これは35回やってもその出目同士で再現は起きていません。
もしseedが再設定されるとした場合には、少なくともその値は256種類以上はありそうだと結論づけています。

今、私が有力だと考えている仮説は
・乱数は2つある 「乱数1:時間で進む」と「乱数2:戦闘などで進む」
・それぞれ、規模は2バイト=2^16
・スロットの出目は、1,2ともに影響する
の3点セットです。もちろん2バイトという量的な推定は適当ですが、これより多いと、現実的に調査は難しいかなと思っています。
前回の書き込みの「2^16を仮定して1時間くらいの調査」というのは、上記の意図に基づいています。

今回、miyaさんとやり取りさせていただいて、乱数の規模の推定がいかに重要か痛感しました。戦闘後の問題も、これ抜きには議論できないですね。
今後も面白い動きがあれば、報告させていただきます。

>このスレッドに関して
私が書いている「スロット乱数制御研究」という研究ログのページから、ここにリンクを貼りたいと思っているのですが、直接だとまずいでしょうか?
特に規模について話は、ここを見るのがわかりやすいと思いますので、参照が容易な形にできればうれしいと思っています。
No.1305-11 miya 2013/06/29(Sat)17:34
seedを考慮に入れるのは何か手掛かりがつかめてからの話のように感じられます。
乱数2^16個でseedが256種類の構成でも、乱数2^24個の1列のみでseedなしの構成でも同様な動作は可能だと思います。
この例なら前者のseedの順送りと後者の2^16番プラスはほぼ同等と考えられます。
先ずは外堀が判断できるような手掛かりがほしいですね。

リンクなどは掲示板もサイト内でも自由にされて構いません。
データの流用も特に気に留めてないので使えるものがあれば使ってください。
No.1305-12 右弐 2013/06/29(Sat)20:07
仰る通り、戦闘後の現象はどちらのモデルでも解釈できるます。
ここも乱数規模を特定できれば自動的に解消される問題なので、少し乱数規模の実験をしようと思います。
2^16付近は、残念ながらループが無かったです。10分おきに6回調べました。

リンクのほうご返答ありがとうございます。こちらのスレッドに直接張らせていただきます。
No.1305-13 miya 2013/06/30(Sun)01:05
2^16はちょっと小さ過ぎるでしょうね。
2^20を調べることもあるかと思いますが、その際は100万などの10進数のキリ番も視野に入れてみてください。
新たな発見があることを期待してます。
※このスレッドへの書き込みは終了しました