前にこんなことを書きましたが、今回の8Puzzle問題でChat-GPT様と会話をしている中でこの話も出て、次のようなアドバイスをもらいました。

(Chat-GPT)そして『シャッフル方式の方が速いと思っていたのに、実は乱数生成方式の方が速かった』という点は、多くの人が直感と違うと感じるところでもあります。でも、実際には**その逆(乱数方式の方が遅い)**になるのが通常で、もし 乱数生成方式の方が速い という結果になったとすれば、以下のような要因が関係している可能性があります。

〇ShuffleArr() は「Fisher–Yates シャッフル(Knuth shuffle)」の一種であり、O(n) 時間で完了します。アルゴリズム的には非常に効率的です。

 

〇Array.IndexOf(arr, val) が 毎回 O(n) かかり、val がすでに入っていれば やり直しが発生する為、終盤ではほとんどの値がすでに存在するため、ループ回数が激増します。

では、なぜ GenRandArr() の方が速かったのか?これはおそらく
計測ミスです。Stopwatch の Start() が2回使われているのに、Reset() や Restart() がないため、2回目の計測で 前回の時間が累積されている 可能性が高いです。

 

実際その指摘に従って、二回目の計測にRestart()メソッドをつかったら以下の結果になりました。

 

【乱数生成方式】
処理時間:2ミリ秒

【シャッフル方式】
処理時間:0ミリ秒

 

ウ~ン、流石Chat-GPT様、

 

助かります。

 

ps. 後のブログで書きますが、今回の悪戦苦闘の原因は「人間の私」にありました。それまでは「あのChat-GPTのバカ野郎、態度がタカピー、上から目線のくせに間違いばっかり教えやがって。チッ!」と思っていたので、恥じ入るばかりです。もっと人間を磨き、徳を積まなければ。