Created
December 22, 2020 16:45
-
-
Save yatsuna827/8d4300e3c9c0c115d2ba63f99c36f0d2 to your computer and use it in GitHub Desktop.
FindSeedByBlink_ver_2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 『iフレーム目で瞬きをした場合次にどこで瞬きするか』をあらかじめ計算しておけば速くなるのでは? という発想. | |
// 乱数値から『前回瞬きをしたのが何フレーム以上前なら瞬きが発生するか』が計算できるのでそれを用いる. | |
public static IEnumerable<uint> FindCurrentSeedByBlink_Old(uint seed, uint minIndex, uint maxIndex, int[] blinkInput, int allowanceLimitOfError = 20, int coolTime = 4) | |
{ | |
var res = new List<uint>(); | |
seed.Advance(minIndex); | |
blinkInput = blinkInput.Select(_ => _ - (5 + coolTime)).ToArray(); // 瞬き後のクールタイム分を引く. | |
var n = maxIndex - minIndex + 1; | |
// 全て最大間隔で瞬きが行われた場合でも足りるだけ余分に計算しておく. | |
var len = (int)n + 85 * (blinkInput.Length + 2); | |
// 「到達したときに瞬きをするような内部カウンタの値」の最小値に変換する. | |
var countList = seed.EnumerateRand().Take(len + 1).Select(_ => Array.FindIndex(BlinkConst.blinkThresholds_even, x => _ <= x)).ToArray(); | |
// 「その位置で瞬きをした場合に次に瞬きが発生するのは何フレーム後か」を計算する. | |
var blankList = Enumerable.Repeat(86, len).ToArray(); // 86 = INF | |
for (int i = len - 1; i >= 0; i--) // 後ろから埋めていく. 確率的にcountListは大きい値が多く, 特に85になる確率が高い. | |
for (int k = countList[i]; k <= Math.Min(i, 85); k++) // kは『到達したときに瞬きするような内部カウンタの最小値』から85まで(境界を超えないように). | |
blankList[i - k] = Math.Min(blankList[i - k], k); // kの定義より, i-kで瞬きをしたら, 次は少なくともiで瞬きが発生する. | |
// 『iフレーム目に1回目の瞬きが行われた』と仮定してシミュレート. | |
for (int i = 0; i < n; i++) | |
{ | |
int idx = i; | |
int k; | |
for (k = 0; k < blinkInput.Length; k++) | |
{ | |
// 許容誤差を超えているなら次のフレームへ. | |
if ((blinkInput[k] + allowanceLimitOfError) < blankList[idx] || blankList[idx] < (blinkInput[k] - allowanceLimitOfError)) break; | |
// 間隔ぶんをindexに加算する. | |
idx += blankList[idx] + 1; | |
} | |
// 入力と全て一致すればresに入れる. | |
if (k == blinkInput.Length) res.Add((uint)idx); | |
} | |
return res.Distinct().Select(_ => seed.NextSeed(_)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment