riv*_*ken 4 random ethereum solidity smartcontracts
我知道solidity中的“如何生成随机数”是一个非常常见的问题。然而,在阅读了绝大多数答案后,我没有找到适合我情况的答案。
我想要做的简短描述是:我有一个对象列表,每个对象都有一个唯一的 id,一个数字。我需要生成一个包含 25% 这些对象的列表,每次调用该函数时都会随机选择这些对象。不能依赖调用该函数的人提供会以某种方式影响结果列表的输入。
我发现给出安全随机数的唯一答案是Here。然而,这取决于参与者的输入,并且旨在解决赌博场景。我无法在我的实现中使用它。
所有其他情况都提到生成的数字将是可预测的,甚至其中一些依赖于单个输入来生成单个随机数。再一次,对我没有帮助。
总而言之,我需要一个函数来为我提供多个不可预测的随机数。
谢谢你的帮助。
这是一个选项:
function rand()
public
view
returns(uint256)
{
uint256 seed = uint256(keccak256(abi.encodePacked(
block.timestamp + block.difficulty +
((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)) +
block.gaslimit +
((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)) +
block.number
)));
return (seed - ((seed / 1000) * 1000));
}
Run Code Online (Sandbox Code Playgroud)
它生成一个0-999之间的随机数,基本上无法预测它(它已被一些著名的Dapp使用,例如Fomo3D)。