[英]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.