Solidity
我想得到100-999之間的隨機數,如下
function random() internal returns (uint) { uint random = uint(keccak256(now, msg.sender, nonce)) % 1000; nonce++; return random; }
這樣可以生成隨機數,但是會小於100,怎麼解決,謝謝
您想要的是 900 個選項範圍內的隨機數。
所以這樣做:
function random() internal returns (uint) { uint randomnumber = uint(keccak256(abi.encodePacked(now, msg.sender, nonce))) % 900; randomnumber = randomnumber + 100; nonce++; return randomnumber; }
基本上你得到一個從 0 到 899 的數字,然後加上 100 來匹配你的偏移量。
由於您使用塊雜湊作為隨機數種子,這實際上是一個偽隨機實現。有關更多資訊,請參閱此文章。要正確地做到這一點,您需要一個具有可證明隨機驗證的去中心化預言機。Chainlink VRF就是您的答案。
這是您請求的 kovan 實現,您可以將其部署為與此連結重新混合。您可以查看Chainlink 文件以執行範例演練,以了解如何發出 Chainlink 請求。
pragma solidity 0.6.6; import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol"; contract RandomNumberConsumer is VRFConsumerBase { bytes32 internal keyHash; uint256 internal fee; uint256 public randomResult; /** * Constructor inherits VRFConsumerBase * * Network: Kovan * Chainlink VRF Coordinator address: 0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9 * LINK token address: 0xa36085F69e2889c224210F603D836748e7dC0088 * Key Hash: 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4 */ constructor() VRFConsumerBase( 0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9, // VRF Coordinator 0xa36085F69e2889c224210F603D836748e7dC0088 // LINK Token ) public { keyHash = 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4; fee = 0.1 * 10 ** 18; // 0.1 LINK } /** * Requests randomness from a user-provided seed */ function getRandomNumber() public returns (bytes32 requestId) { require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet"); return requestRandomness(keyHash, fee); } /** * Callback function used by VRF Coordinator */ function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override { randomResult = randomness; } }