前の値と連続しないようにランダムで整数値を取得してみました。
まず0~3の長さ4の連続した数字の中から連続して2を選んだとします。
連続したくないので今欲しいのは0か1か3です。これは、2に1~3を足して、長さ4を超えたものを折り返したものです。
重複しない値が出るまで何度も繰り返すより、ランダムで値を選ぶのが最大2回と決まっている方がいいと思いました。
また、配列を使って、インデックスが1以上の要素からランダムで選び、選ばれた要素と先頭の要素を交換するという方法もあります。複数のものが同じ配列からランダムに値を引くときに困りました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RandomTest : MonoBehaviour
{
int num;
int preNum = -1;
int length = 10;
int GetRandomValue(int oldNum)
{
int newNum = Random.Range(0, length);
// 古い番号と同じとき
if(newNum == oldNum)
{
int n = newNum + Random.Range(1, length);
return n < length ? n : n - length;
}
else
{
return newNum;
}
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
int time = 10000;
for (int i = 0; i < time; i++)
{
num = GetRandomValue(num);
if(num == preNum)
{
Debug.Log(i + "回目に連続:" + num);
break;
}
preNum = num;
if (i == time - 1) Debug.Log("完了");
}
}
}
}
まず0から指定の長さまでの値からまずランダムで整数値を得ます。
int newNum = Random.Range(0, length);
それが前の値と違えばそのまま返しますが、同じときは、新しい値に0からでなく1から指定の長さまでのランダムな整数値を足します。
int n = newNum + Random.Range(1, length);
それが指定の長さより小さければそのまま、それ以上であれば、長さの値を引いて返します。
return n < length ? n : n - length;
一応何度か試すと、連続した数字は出ませんでした。