【Unity 入門】Unityで乱数(ランダムな数)をRandomを使って生成する方法
今回はUnityでの乱数を生成する方法について説明します。
乱数はゲームでランダムシーンを実現するために必要なので、この記事を機にしっかりと使えるようにしていきましょう。
本記事では以下の内容を説明していきます。
- 乱数とは
- Randomクラスを使用して乱数を生成する
- 乱数を使用する際の2つの注意点
- Unityの乱数の偏りについて
乱数とは
そもそも乱数とは、ある範囲の数値から任意に(ランダムに)取り出した数値のことです。
ゲームにおける乱数といえば、敵と遭遇するかどうか、宝箱の出現確率、魔法攻撃の状態異常が発生するか、など様々なシーンで使われています。
つまり、ゲーム開発には乱数が必須と言えます。
では、乱数をUnityではどう実現すればよいかを説明していきます。
Randomクラスを使用して乱数を生成する
Unityで乱数を生成する時は、C#のRandomクラスを使います。
よく使われるのは以下の2つです。
- Random.value
- Random.Range(最小値,最大値)
Random.value – ランダムの数値を返す
Random.valueは範囲が0fから1.0fまでのランダムな数値を返してくれます。(fはFloat(浮動小数点)型のfを意味しています。)
Random.valueを初期値として使う場合は以下のスクリプト(ソースコード)になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { void Start () { print (Random.value); } void Update () { } } |
例えばこのスクリプトを使ってみます。空のオブジェクト「GameObject」を作成して「Test1.cs」というスクリプトをGameObjectに設定します。
その後、再生ボタンを押してみると、コンソール画面に下記のような表示がされます。
確かに0から1の間の数値が表示されていますね。
Random.Range(最小値,最大値)- 決められた範囲から値を返す
次に、Random.Range(最小値,最大値)ですが、これは乱数の範囲を決めることができます。
Random.valueの範囲は0~1の固定なので、自由に範囲を変更したい時はRandom.Rangeを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test1 : MonoBehaviour { // Use this for initialization void Start () { print (Random.Range (1.0f, 100.0f)); } // Update is called once per frame void Update () { } } |
RandomクラスのRangeメソッドを使っているのですが、より詳しい説明はunityの公式リファレンスをご確認ください。
乱数を使用する際の3つのポイント
乱数のシード値を変更する(初期化する)場合はRandom.InitState(数値)
さて、ここで問題になってくるのが乱数のシード値でしょう。
シード値とは乱数の値の元になる値です。
実は乱数生成は真にランダムでなくシード値をもとに事前に決まった順番で番号を生成しているのです。
つまり、シード値を変更しなければ規則的に同じ順番で同じ番号が生成されるようになります。
したがって、疑似的に乱数を実現したい時などに、シード値を変更する(初期化とも言われます)場合があります。
その際に使用するのがRandom.InitState(数値)になります。
ただし、この数値の部分に固定値を入れてしまうと結局シード値は変更されず規則性を崩すことができないので、変数を利用することが多いです。
例えば現在の日時をシード値に設定することで、乱数のシード値を擬似的にランダムにすることができます。
1 |
Random.InitState( System.DateTime.Now.Millisecond |
Float型とInt型のRangeの最大値の範囲に注意
- Float型の場合
Random.Range(A,B)とした場合に、A以上B以下の値を返します。
ポイントはBを範囲に含めるというところです。
- Int型の場合
Random.Range(A,B)とした場合に、A以上B未満の整数を返します。
ポイントはBは範囲から除外されるというところです。
整数の乱数で重複無しを実現するにはListを利用する
整数の乱数の場合対象となる数値の数がFloat型より少なくなるのは明らかです。
そこで、重複を失くす方法を教えます。
C#のList(リスト)クラスを使用します。
- Listに対象となる整数の全てを記録します。
- 乱数で帰ってきた値のインデックスの値を抽出します。
- 乱数で返ってきた値をListから削除します。
以上でシンプルに重複無しが実現できます。
Unityの乱数の偏りについて
さて、乱数の生成方法は分かりました。
次に気になることは乱数に偏りがないかということですね。
結果から言うと、Unityの乱数は偏りが小さいと言われています。
色々な検証で実証されているので、以下をご参考ください。
参考サイト
→)【Unity】少ない試行回数で乱数が偏っているように感じる件を調査
まとめ
今回はUnityでの乱数を生成する方法であるRandomクラスについて説明しました。
Unityでゲームを作成する際にはぜひこのRandomを使って、自分の思うようなランダム要素を作成していただければ幸いです。
他のUnityでのC#について知りたい方はこちら
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!