Unity 中的隨機數!

2021-07-09 06:56:55 字數 3467 閱讀 1709

孫廣東  2015.1.3

關於unity遊戲執行中的 隨機數:

unity/editor/data/documentation/en/manual/randomnumbers.html

新增隨機遊戲元素

在許多遊戲中,隨機選擇的items或values是很重要的。本節展示了如何使用unity的內建隨機函式來實現一些常見的遊戲機制。

選擇乙個隨機item遊戲元素從陣列中:

在隨機選擇乙個陣列元素時,可以選擇乙個零和陣列的最大值(這是等於陣列的長度減去 1 )的隨機整數。這是很容易使用內建的隨機函式:—

var element = myarray[random.range(0, myarray.length)];

注意,random.range 從乙個範圍(包括第乙個引數但不包括第二)返回乙個值,所以使用 myarray.length。在這裡能給出正確的結果。

選擇不同概率的items:

有時,你需要選擇隨機的物品,但有些物品更容易被選上。例如,npc可能會反應在幾個不同的方式,當它遇到乙個玩家:

50% 友好的問候的機會

25% 逃跑的機會

20% 直接攻擊的機會

5% 提供金錢作為禮物的機會

你能想象這些不同的結果作為一條紙分成幾部分分別佔總長度的一小部分的條。所佔比例等於被選擇的結果的概率。作出選擇是相當於挑選乙個隨機點沿帶狀的長度(例如投擲乙個飛鏢),然後看到它是在。

在指令碼中,該檔案條實際上是乙個float 的陣列,該陣列中包含的item的不同的概率。隨機點則是由float陣列總大小乘以 random.value 值來獲得(他們不需要總計達1;重要的是不同的值和 相對大小)。為了找出隨機點元素落在哪個點陣列,首先檢查看它是否是小於第乙個元素的值。如果是的話,那麼第乙個元素將被選擇。否則,從陣列中減去第乙個元素的值,比較第二個元素,直到找到正確的元素。類似於下面這個**:

//c#

float choose (float probs)

float randompoint = random.value * total;

for (int i= 0; i < probs.length; i++)

else

}return probs.length - 1;

}

需要注意的是最後乙個return語句非常必要,因為random.value可以返回1(注:有些地方random.value都是不能返回1,可以返回0)。在這種情況下,我們會無法獲得隨機點,更改**行:

if (randompoint < probs[i])

乙個小於或等於的if測試語句將避免額外的return語句。因為即便選中它的概率是零。它也有可能被選中。

//c#

float curveweightedrandom(animationcurve curve)

乙個 『raw』 的隨機值在0和1之間,是通過閱讀從random.value選擇。然後通過 curve.evaluate() ,以它為橫座標,並返回到水平位置的曲線對應的垂直座標。曲線的淺部分有更大的機會被選中,而陡峭的部分有乙個較低的機會被選中。

這條曲線在開始和結束時都很淺,使得值接近於極端更為普遍,在中間,這將使這些值稀少。還注意到這個曲線,高度的值已經被移了:曲線的底部是1,並且曲線的頂部是在10,這意味著所產生的曲線將在1 - 10範圍,而不是0 - 1像以前的曲線。

注意,這些曲線不是概率分布曲線,就像你在概率論中找到的,但更像是逆累積概率曲線。

通過乙個指令碼定義乙個公共animationcurve變數,你將能夠看到和編輯曲線通過inspector視窗形象,而不需要計算值。

此技術產生浮點數。如果你想計算例如整數結果,你需要82個金幣,而不是82.1214枚金幣----你可以通過計算值為mathf.roundtoint().一樣的功能。

乙個普遍的遊戲機制是從乙個已經進行隨機順序的陣列中選擇乙個需要的資料。例如,一副牌通常會被打亂,所以你不會預見到它們的排列順序。同樣這你可以通過隨機交換陣列中的元素或改變它們的索引值來打亂它們之間的順序。

//c#

void shuffle (int deck)

}

法1:乙個簡單的要求是在選擇陣列中,同乙個元素最多只能被隨機選中一次。例如,您可能要在隨機點的位置生成npc,但可以肯定,在每乙個點只能有乙個npc產生。這可以通過遍歷序列中的專案,為每乙個隨機點決定是否被新增到選擇集。剩下的元素被選中的概率等於需要選擇的元素數量除以剩下的所有元素數量。

例如,假設有十個重新整理復活點可以用,但是必須只能選擇五個。第乙個物體被選擇的概率將是5/ 10或0.5。如果選中第乙個之後,第二個的概率為4 /9或0.44(即,四個物體仍然需要從剩下的九個選擇)。然而,如果第乙個沒有選中,第二個選中的概率為5/ 9(即5/ 9或0.56,仍然需要從剩下的九個中選擇)。這一直持續到要求的5個都被選上。完成的**如下:

//c#

transform spawnpoints;

transform chooseset (int numrequired) }}

return result;

}

請注意,雖然選擇是隨機的,在選擇集中的資料在原始陣列的排列順序依然相同。如果資料排序是一次性的話,部分隨機的資料有可能是可預見到的,所以它有必要在使用前就打亂陣列的順序。

法2:使用list , 選擇了乙個之後,移除那個, 然後繼續隨機

法3:新增另外乙個陣列,標識每個元素是否被選中了,如果選中就重新隨機啊!

乙個三維空間中的點,可以通過random.value函式中隨機返回乙個為vector3的xyz值

var randvec = vector3(random.value, random.value, random.value);

上述函式所給的這個立方體中的點會分布在同一條邊上。而將所需的邊長乘以vector3的x,y和z分量就可以簡單的進行比例縮放。另外,如果其中乙個軸的值被設定為零,這一點始終分布在乙個單獨的平面。例如,選擇"地面"上的乙個隨機點通常是把y分量設為零,然後隨機設定x和z分量值。

當它是乙個球體時(即:當你想從給定的半徑內獲取乙個隨機點),您可以使用所需的半徑大小乘以random.insideunitsphere:

var randwithinradius = random.insideunitsphere * radius;

注意:如果你設定了vector中的某個向量值為零,你獲得的隨機點將"不會"圍成乙個圓。雖然這一點的獲取確實是隨機的且半徑也是正確的。這個點分布的概率在很大程度上偏向圓的邊緣且極不均勻。要讓它分布在圓上的話可以使用random.insideunitcircle做到。

var randwithincircle = random.insideunitcircle * radius;



Unity中隨機數 寫法

unityengine.random.initstate 10 帶有種子的 10就是種子 每次隨機結果都一樣 debug.log unityengine.random.range 10,100000 unityengine.random.initstate 如果不帶種子 每次隨機結果就不一樣 deb...

隨機數 偽隨機數

隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...

隨機數生成 偽隨機數和真隨機數

c語言隨機數的生成,很隨機,又不隨機,比如像下面的程式 c語言生成隨機數的函式在stdlib.h庫中 include includeint main return 0 上面的 經過執行生成了 41 18467 6334 26500但是無論執行多好遍結果都是一樣的,隨機數並不隨機。這是因為rand 函...