Shuffle Bags讓你的隨機不那麼隨機

2021-08-19 02:33:31 字數 1399 閱讀 8869

前言

當我最初寫遊戲時,我經常使用標準random()函式,然後寫一堆if和else條件來我獲得預期結果。如果結果不太好,我會寫更多的條件進行過濾或者篩選,直到我覺得遊戲變得有趣。最近我發現有更好的方法。內建的random類並沒有問題,問題是使用內建的random類很難達到我們的預期效果。

現實生活中,以拋硬幣為例,時而會丟擲連續多次花或者字。那麼如果在遊戲中,可能表現為多次連續的暴擊或是硬直,儘管有時暴擊和硬直的概率很低,但依舊有可能連續出現,讓人感覺詭異。那麼為了解決類似的問題,前輩們想了很多種方法,比如說特殊值過濾等等。我們今天介紹的是shuffle bag技術,可以讓你的隨機數不那麼隨機,由你掌控。

什麼是shuffle bag呢?

shuffle bag是一項讓我們可以控制隨機數分布的技術。

其主要原理為:

不難看出,shuffle bag 特性如下:

不會產生集合之外的資料。

它仍然具有隨機性,元素出現的順序還是隨機的。

非重複抽取,如果資料集中某個元素只有乙個,至多連續出現兩次。

如何實現shuffle bag?

原文使用c#,這裡使用unity c#和泛型,大家可以很方便的轉譯為其他語言。實現並不是先把整個揹包先隨機打亂,而是每次抽取時,才進行一次隨機交換,這樣做可以分攤效能,不至於在揹包資料較多時,打亂揹包消耗某幀過多效能。

using system.collections.generic;

using unityengine;

public class shufflebag }

public int size }

public shufflebag(int initcapacity)

public void add(t item, int amount)

public t next()

var pos = random.range(0,currentposition);

currentitem = data[pos];

data[pos] = data[currentposition];

data[currentposition] = currentitem;

currentposition--;

return currentitem;

}}

如何使用shuffle bag?

shufflebaghurtbag = new shufflebag(10);

hurtbag.add(false, 9);

hurtbag.add(true, 1);

//當觸發受傷時,呼叫以下邏輯
if(hurtbag.next())

附錄

Shuffle Bags讓你的隨機不那麼隨機

前言 當我最初寫遊戲時,我經常使用標準random 函式,然後寫一堆if和else條件來我獲得預期結果。如果結果不太好,我會寫更多的條件進行過濾或者篩選,直到我覺得遊戲變得有趣。最近我發現有更好的方法。內建的random類並沒有問題,問題是使用內建的random類很難達到我們的預期效果。現實生活中,...

讓小車隨節拍律動的基礎程式設計

include define uchar unsigned char 偽指令 define uint unsigned int 簡化指令 sbit p1 0 p1 0 uint n,v,jiepai,dongzuo 要記得先定義變數呦。uint xnh 定義陣列,音符,節拍,動作值,我就隨便舉幾個音...

如何讓程式隨開機自動啟動

if 需要開機啟動 得到程式自身的全路徑 dword dwret getmodulefilename null,pfilename,max path 新增乙個子key,並設定值 下面的 test 是應用程式名字 不加字尾.exe lret regsetvalueex hkey,test 0,reg ...