Solidity - 生成不依赖于输入的不可预测的随机数

riv*_*ken 4 random ethereum solidity smartcontracts

我知道solidity中的“如何生成随机数”是一个非常常见的问题。然而,在阅读了绝大多数答案后,我没有找到适合我情况的答案。

我想要做的简短描述是:我有一个对象列表,每个对象都有一个唯一的 id,一个数字。我需要生成一个包含 25% 这些对象的列表,每次调用该函数时都会随机选择这些对象。不能依赖调用该函数的人提供会以某种方式影响结果列表的输入。

我发现给出安全随机数的唯一答案是Here。然而,这取决于参与者的输入,并且旨在解决赌博场景。我无法在我的实现中使用它。

所有其他情况都提到生成的数字将是可预测的,甚至其中一些依赖于单个输入来生成单个随机数。再一次,对我没有帮助。

总而言之,我需要一个函数来为我提供多个不可预测的随机数。

谢谢你的帮助。

Sti*_*asy 5

这是一个选项:

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)。