首页 > 解决方案 > Solidity - 生成不依赖于输入的不可预测的随机数

问题描述

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

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

我发现提供安全随机数的唯一答案是Here。但是,这取决于参与者的输入,它旨在解决赌博场景。我不能在我的实现中使用它。

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

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

谢谢你的帮助。

标签: randomethereumsoliditysmartcontracts

解决方案


这是一个选项:

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));
}

它会生成一个 0-999 之间的随机数,基本上是无法预测的(Fomo3D 等一些著名的 Dapp 已经使用它)。


推荐阅读