真正亂的亂數

程式裡的亂數是透過亂數產生器(random number generator)的運算結果。亂數產生器是一種演算法,它根據一個亂數種子(random seed)來產生後續的數字序列。兩個相同的 seeds 所產生的亂數序列會一模一樣。不幸的是 Grasshopper 裡的 Random 元件,每次初始 seed 值都一樣是 2,這代表什麼?代表它所產生的亂數根本不亂!你看~


要得到真正亂的亂數序列,就要改變 seed,也就是讓 seed 本身每次都不能相同、要夠隨機,但這不是變成「雞生蛋、蛋生雞」的問題嗎?放心,電腦科學界的前輩們已經有好方法了。就是將一個永遠會不斷往前數的計數器當做 seed,也就是時間。將電腦裡的時間當做 seed,由於時間會不斷改變,可以確保 seed 的不確定性。

不過 Grasshopper 裡沒有取得系統時間的元件,得靠程式元件來做到。這裡我們用 C# 元件示範:


C# 函式的內容很簡單:
A = System.DateTime.Now.Millisecond;
用意是取得目前時間的毫秒。當然 0-999 的範圍內還是有可能重複,但起碼夠亂了。如果要亂個徹底,可以拿系統時間(System Time)來用。左邊的 Slider 只是用來觸發 C# 元件重新計算,沒有實際作用。

[2010-03-10更新]
為了取得更亂的亂數,可以改用 Ticks。Ticks 是不斷累計的系統時鐘,是個非常大的整數,以我的電腦為例,每秒鐘有一千萬個Ticks,實在足夠了。
只要把上述函式改為
A = System.DateTime.Now.Ticks % 10000000;
便可取得 1~9999999 之間的一個整數。其實這個整數本身就已經夠亂了,可以直接使用。

[2011-10-07更新]
改成以下程式碼可以使用 C# 的亂數函數直接取得亂數,不需要再接GH的亂數元件了:
Random r = new Random();
A = r.NextDouble();

留言