首頁>Club>
16
回覆列表
  • 1 # 俺們屯俺最6

    無論在現實世界還是《我的世界》中,隨機數都是一個有意思的東西,它可以用來抽獎,甚至還能用來設定密碼。不過事實上,利用計算機生成的隨機數都是偽隨機數,嚴格的真隨機數並不存在,本篇教程中的隨機數生成器的目的是讓生成的隨機數更加接近真隨機,利用這個生成器能夠生成0-255的隨機數。

    一、基本原理:

    首先我的世界中,物品分為可堆疊(羊毛)以及不可堆疊(鐵劍),他們在容器(漏斗)中可被比較器讀取,輸出不同的訊號強度。在漏斗中,單一物品所輸出的訊號強度,可堆疊物品為1,不可堆疊為3,這可以從下圖中紅石燈亮起的數目看出。

    透過將投擲器與漏斗相連,我們得到投擲器-漏斗脈衝發生器,同時我們在投擲器中分別加入羊毛和鐵劍,來分析這種情況下投擲器會優先輸出可堆疊還是不可堆疊物品。

    按照上圖做一個高頻電路來控制投擲器-漏斗脈衝發生器,讓其不斷輸出訊號,在具體操作中,我們發現紅石燈亮起的數目在1和3之間不斷隨機切換,因此我們可以發現投擲器投擲物品是隨機的。

    二、最簡單的隨機數生成器

    從一中的裝置我們知道了比較器輸出的訊號強度會在1和3之間切換,因此我們可以將其改造成輸出0和1的裝置,即在比較器後三格處放一個紅石燈,這樣如果比較器輸出的訊號強度為3,那麼紅石燈亮,如果輸出強度為1則紅石燈滅。

    有了這個基礎之後,我們就可以製作一個最簡單的隨機數生成器,如下圖所示,將這個裝置複製8份,這樣就變成了一個8位的隨機數生成器。將它們接入到高頻電路上,紅石燈會一直在亮滅之間隨機變化,利用下面那個拉桿固定紅石燈狀態,我們用紅石燈的狀態來表示二進位制中的0和1,亮為1,滅為0。那麼下圖這一時刻表示的二進位制數字就是01110011,轉換為十進位制就是115。利用這個裝置能生成的最大數為11111111,即255。

    因為投擲器投擲物品具有隨機性,所以其實對大多數玩家來說,這樣的隨機數生成器就能用了。但是實際上,投擲器是應用偽隨機機制射出容器內物品,雖然看似隨機,但還是有規律可循。

    三、較嚴謹的隨機數生成器

    在玩家不瞭解偽隨機公式的情況下,二中的隨機數生成器也可以實現隨機生成數字的功能,但是這樣的結果肯定不夠完美。因此,我們接下來就要製作一個更加嚴謹的隨機數生成器。

    下面這張是完成圖:

    每個隨機單元採用4個投擲器-漏斗結構。當這個單元被啟用後,4個投擲器同時輸出一次脈衝。只要其中1個脈衝的訊號強度為3,這個脈衝將會啟用加法狀態的紅石比較器,這個單元將被再次啟用;如果4個脈衝的強度都為1,那麼這個單元將只被啟用一次後停止運作。

    下面我們就開始建造吧~

    第一步:建造第一層,如下圖所示,放置紅石和紅石中繼器,注意中繼器的方向,當中繼器被啟用時中間的四個完整方塊和紅石將被充能。

    第二步:建造第二層,四個投擲器呈十字擺放,方向朝上,在第一層的紅石中繼器上方各放置一個方塊。

    第三步:第三層,在每個投擲器上面放一個漏斗,四個角分別放一個紅石比較器,紅石比較器的輸出端放一個完整方塊,當紅石比較器輸出訊號時,方塊被充能從而啟用其下方的紅石線。這麼一來,就實現了只要四個漏斗其中1個脈衝的訊號強度為3,就會啟用相鄰的投擲器。這樣便大大增加了其不確定性,也就增加了隨機數產生的隨機性。

    第四步:為了增加隨機性,我們可以將第三步中的隨機單元進行復制連線。如下圖,我們將以上隨機單元複製32個,構成4*8的矩陣。每2個單元共用一條鄰邊,這意味著如果這條邊獲得一次強度為3的脈衝訊號,那麼這個單元在啟用自身的同時也將啟用與它相鄰的另一個隨機單元,起到傳遞訊號的效果。在試驗中,我們發現在投擲器中放入1份不可堆疊物品與3份可堆疊物品比較合適,這樣能讓這個訊號不停地在單元與單元之間傳遞,而不會全部停止運作,也不至於全部都輸出3強度而卡死。

    第五步:如下圖所示,最終在整個模組的邊緣,我們選取了8個輸出位置,作為輸出的8位二進位制數,點亮的紅石燈代表1,熄滅的代表0。這個訊號每3紅石刻變化一次,使用拉桿來固定某個時刻的輸出,也就是讓玩家手動選取,這樣加入了玩家自身的因素,可以增加數字生成的隨機性,不單單只是程式碼運算的隨機結果。

    以上就是隨機數生成器的介紹,原理比較簡單,但是建造過程可能相對複雜,對於有較豐富紅石經驗的玩家,可以嘗試建造bcd(二進碼十進數)模組,將二進位制訊號轉化為十進位制數字方便檢視。在知道了原理之後,玩家們也可以發揮想象力,建造出更加嚴謹的隨機數生成器~

  • 中秋節和大豐收的關聯?
  • 你們玩過的最舒服的或者最難受的一局吃雞是什麼?