beatorajaのランダム処理を書き換えた

この記事はで読むことができます。

いづなな
いづなな

このゲーム、ランダムが偏ってる気がするな?

人間、悪いことばかり印象に残ってしまうものでして、2356がいっぱい来てるだとか7バスばかりだとか、なんか悪い方向に乱数が寄ってる気がしてならないんですよね。
実際のところそんなことはないんでしょうけど、なんかそんな気がしてしまうものです。
使用しているリザルトスキンではランダムの配置が見られないので、本当は2356配置じゃないのかもしれませんし。

とはいえ一度気になってしまうともうどうしようもない性格をしているので、beatorajaのランダム配置処理を書き換えてしまいました。

代償としてIRに接続できなくなりましたが、元々スコアなんてどうでもいいので気にしないことにします。

元々の処理

Java
protected static int[] shuffle(int[] keys, long seed) {	java.util.Random rand = new java.util.Random(seed);	List<Integer> l = new ArrayList<Integer>(keys.length);	for (int key : keys) {	l.add(key);	}	int max = 0;	for (int key : keys) {	max = Math.max(max, key);	}	int[] result = new int[max + 1];	for (int i = 0; i < result.length; i++) {	result[i] = i;	}	for (int lane = 0; lane < keys.length; lane++) {	int r = rand.nextInt(l.size());	result[keys[lane]] = l.get(r);	l.remove(r);	}	return result;
}
beatoraja/src/bms/player/beatoraja/pattern/PatternModifier.java at master · exch-bms2/beatoraja (github.com)

こちらがbeatoraja v0.8.7時点の通常ランダムを処理している関数になります。

そして、私が書き換えたのが以下。

書き換えたやつ

Java
protected static int[] shuffle(int[] keys, long seed) {	RandomGenerator rng = new MersenneTwister(seed);	for (int i = keys.length - 1; i > 0; i--) {	int j = rng.nextInt(i + 1);	int temp = keys[i];	keys[i] = keys[j];	keys[j] = temp;	}	return keys;
}

何も考えずにシンプル実装にしてみた。

これが何が変わるのか、というか何も変わらないだろうけどしばらく様子見をしてみようと思う。