Chainlink
使用模數從 Chainlink 的 VRF 數中獲取範圍是個好主意嗎?
我正在建立一個彩票遊戲合約,我需要從 chainlink VRF 的號碼中獲取一系列值。範圍是玩家列表的長度。為簡單起見,我製作了一個簡單的合約,展示了我如何從 Chainlink 的 VRF 數中獲取範圍隨機數的想法。為此,我決定採用 Chainlink 號碼的模 N,其中 N 是玩家列表的長度。
我擔心的是這個過程會使數字不那麼隨機,更有偏見,因此不公平。我有理由擔心嗎?如果是這樣,解決這個問題的更好方法是什麼?
pragma solidity ^0.8.0; contract GetRandomNumber{ string[] playersList = ["bob", "alice", "lux", "ahri", "nunu", "amumu", "jax", "olaf", "jinx", "vayne", "twitch", "alistar", "annie", "leona", "warwick"]; uint256 public randomNumber; //actual random number from Chainlink VRF uint256[] chainlinkVRFNumberList = [64062631830175213092191689838209884690462398265195175129745934432936884152163]; uint256 public chainlinkVRFNumber = chainlinkVRFNumberList[0]; constructor(){ getNumber(chainlinkVRFNumber); } function getNumber(uint256 x) internal { uint256 value = (x % playersList.length) + 1; randomNumber = value; } }```
由於 Chainlink VRF 返回的數字是可驗證的隨機數,這就是隨機性的重要來源。N 對於隨機性並不是很重要,因為 N 在呼叫的整個生命週期中可能會或可能不會保持恆定值。
但由於 VRF 返回的 uint 是隨機的,因此對該數字應用模 N 的結果也將是隨機的。
作為一個簡單的思維實驗,在你的腦海中隨機選擇 0 到 20 之間的數字並應用模 4(或其他數字)。根據您選擇號碼的隨機程度,結果會有所不同且“隨機”。
這是假設您每次都丟棄 VRF 返回的數字並使用一個新數字。重複使用隨機數進行多次計算可能會降低隨機性。