[C#] 隨機產生值 v.s. Unity 隨機產生值

隨機產生一個值在程式設計中算是滿常使用到的一個需求

可能你希望每次進來程式的時候,都可以讓使用到感到不一樣

因此你就會需要「Random」隨機值

C#

而在 C# 中,有個一名為「Random」的類別,用來產生你需要的隨機值

static void Main(string[] args)
{
    Random ran = new Random();
    for (int i = 0; i < 10; i++)
    {
        // ran.Next() = 傳回一個非負的亂數整數
        // ran.Next(int maxValue) = 傳回一個不大於 maxValue 的非負亂數整數
        // ran.Next(int minValue, int maxValue) = 傳回一個不小於 minValue且不大於 maxValue 的非負亂數整數
        Console.WriteLine("Random value = {0}.", ran.Next(0, 10));
    }
    Console.Read();
}

使用「Next( )」的函式來取得一個隨機值,Random 提供了三個多載函式。(說明在程式碼的註解)

Random 的預設值是以「系統時間」來產生隨機值

所以可能在短時間內會產生一樣的數

若想避免這個問題

可以在初始化 Random 物件的時候,給予一個值。

我們這邊來產生一個 HashCode

這樣一來就比較能避免掉重複值一直出現的問題。

static void Main(string[] args)
{
    Random ran = new Random(Guid.NewGuid().GetHashCode());
    for (int i = 0; i < 10; i++)
    {
        // ran.Next() = 傳回一個非負的亂數整數
        // ran.Next(int maxValue) = 傳回一個不大於 maxValue 的非負亂數整數
        // ran.Next(int minValue, int maxValue) = 傳回一個不小於 minValue且不大於 maxValue 的非負亂數整數
        Console.WriteLine("Random value = {0}.", ran.Next(0, 10));
    }
    Console.Read();
}

所得出來的結果是一樣的。


image


Unity3D

這篇其實是在用 Unity3D 遊戲引擎寫遊戲的時候發現的(使用的語言也是 C#)

因為以前用 C# 寫程式的時候,很直覺的就會使用 上一段的方法來產生隨機值

但 Unity3D 其實自己有提供一個也叫「Random」的類別

不過其類別的屬性皆為靜態

而產生隨機值的函式名稱也不同

而在 Unity3D 中使用的方式很簡單

程式碼如下

// float Range(float min, float max) = 回傳一個不小於 min 且不大於 max 的隨機浮點數值
// int Range(int min, int max) = 回傳一個不小於 min 且不大於 max 的隨機整數值
int i = Random.Range(0, 100);
float j = Random.Range(0.0f, 100.0f);

Range 是一個靜態函式,提供兩種回傳型別 int 和 float

而且一定得給最小值和最大值

還有一個差異是 – 值可以是「負」的!!

而因為這個地方和 C# 本身的是一樣,也是採用目前系統的時間當種子去產生隨機值

所以在 Unity3D 也是可以讓你去變更種子的

我們一樣是使用 HashCode 來當種子

Random.seed = System.Guid.NewGuid().GetHashCode();
// float Range(float min, float max) = 回傳一個不小於 min 且不大於 max 的隨機浮點數值
// int Range(int min, int max) = 回傳一個不小於 min 且不大於 max 的隨機整數值
int i = Random.Range(0, 100);
float j = Random.Range(0.0f, 100.0f);

不過因為 Guid 使用到 C# 的 System 命名空間

所以在編譯和包成檔案的時候,也會把這個 dll 給包進去(容量就會增加)

在使用上的話就給大家參考一下

Unity3D Random API 參考連結:http://docs.unity3d.com/Documentation/ScriptReference/Random.html

One thought on “[C#] 隨機產生值 v.s. Unity 隨機產生值

Leave a comment