Solidity
一定範圍內的隨機數生成
我需要在我的智能合約中添加一個隨機數函式。最好使用 Oraclize 和例如 random.org 嗎?這不是彩票,這意味著隨機數生成不需要嚴格的安全性。
回複評論…
雖然你說它不需要高安全性,但我覺得值得一提的是,一個簡單的雜湊函式是可以預測的。例如,
keccak256(now)
可以通過呼叫您的合約的另一個合約輕鬆計算。通過提前計算,它會提前知道你的雜湊函式會產生什麼。這是有效的,因為在兩種情況下時間都是“現在”(相同)。拋開可預測性問題不談,您可以將散列函式轉換為 uint,例如
uint(keccak256(now))
,這將產生一個 0-2^256-1 範圍內的數字。您可以使用除數和偏移量將該數字縮放到所需的範圍和精度。希望能幫助到你。
更新
縮放是一個通用的程式問題,並不是 Solidity 獨有的。我們將取一個已知範圍的數字並將其調整為另一個範圍。
pragma 堅固性 0.5.1;
contract Randomish { uint public constant MAX = uint(0) - uint(1); // using underflow to generate the maximum possible value uint public constant SCALE = 500; uint public constant SCALIFIER = MAX / SCALE; uint public constant OFFSET = 100; // generate a randomish number between 100 and 600. // Warning: It is trivial to know the number this function returns BEFORE calling it. function randomish() public view returns(uint) { uint seed = uint(keccak256(abi.encodePacked(now))); uint scaled = seed / SCALIFIER; uint adjusted = scaled + OFFSET; return adjusted; } }