【Unity】前の値と連続しない整数値をランダムで得る

投稿者: | 2020-11-20

前の値と連続しないようにランダムで整数値を取得してみました。

まず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;

一応何度か試すと、連続した数字は出ませんでした。

少し変えた場合

コメントを残す

メールアドレスが公開されることはありません。