【Unity】アプリ再起動せず乱数を固定にする

DEVELOP

リトライしても同じ乱数が生成される様にする。

目次

そもそも乱数って?

乱数はそもそもシード値という種を元にした乱数テーブルというものを生成する。シード値はアプリ起動時の時間だったりで初期化しランダムな値をそれっぽく引き出す。

乱数を固定にするとは?

シード値を元にして乱数テーブルを生成するのであれば、そのシード値を毎回固定にしてあげれば同じ乱数テーブルが生成されるよねって話。

参考

【Unity道場スペシャル 2017京都】乱数完全マスター 京都編

ここまで資料にしてくれているのはあまり見かけません。素敵です。

乱数を固定にするには?

同じシード値で固定したうえで、乱数取得回数などを初期化した状態にしてやれば良い。

using UnityEngine;
public class RandomEx
{
	private Random.State state;
	public RandomEx(int _seed)
	{
		SetSeed(_seed);
	}
	public void SetSeed(int _seed)
	{
		var prev_state = Random.state;
		Random.InitState(_seed);
		state = Random.state;
		Random.state = prev_state;
	}
	public int Range(int min, int max)
	{
		var prev_state = Random.state;
		Random.state = state;
		var result = Random.Range(min, max);
		state = Random.state;
		Random.state = prev_state;
		return result;
	}
	public float Range(float min, float max)
	{
		var prev_state = Random.state;
		Random.state = state;
		var result = Random.Range(min, max);
		state = Random.state;
		Random.state = prev_state;
		return result;
	}
}
// 乱数の初期化
var randomEx = new RandomEx(123456); // 固定のシード値を設定する。
// 乱数の取得
var spawnNum = randomEx.Range(0, 10);

ゲームオーバー → リトライ時に同じシード値で乱数を再初期化してあげれば全く同じ結果が得られる様になる。

Posted by kazupon