繁体   English   中英

在一个事务中生成多个随机数(Solidity)

[英]Generating several random numbers in one transaction (Solidity)

有没有办法在单个事务中生成多个随机数? 假设我有这个代码:

function example(uint _prop) public{
    while(random(100) < _prob){
      // Do something  
    }
}

while循环的条件取决于每次迭代中选择的随机数。 VRF(Chainlink)可以做到这一点吗? 还是每笔交易只能产生一个随机数?

现在我正在使用这个解决方案:

function random(uint _interval) internal returns (uint) {
    nonce++;
    return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, nonce))) % _interval;
}

但我知道这不是一个随机数......这符合我的目的,但它不正式。 我想改进它。

您想要做的是发出一个Chainlink 随机数请求,然后使用比数字“扩展”到更多随机数,如下所示:

function expand(uint256 randomValue, uint256 n) public pure returns (uint256[] memory expandedValues) {
    expandedValues = new uint256[](n);
    for (uint256 i = 0; i < n; i++) {
        expandedValues[i] = uint256(keccak256(abi.encode(randomValue, i)));
    }
    return expandedValues;
}

由于我们从可验证的随机位置获取随机数,因此我们可以将数字放入其中,然后获取任意数量的随机数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM