Solidity

我想得到100-999之間的隨機數,如下

  • October 28, 2021
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;
   }
}

引用自:https://ethereum.stackexchange.com/questions/60684