random - Solidity - 生成不依赖于输入的不可预测的随机数
问题描述
我知道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));
}
它会生成一个 0-999 之间的随机数,基本上是无法预测的(Fomo3D 等一些著名的 Dapp 已经使用它)。
推荐阅读
- python - 拆分字符串并替换在一列数据框中
- java - 如何在 Android Studio 中存储用户给出的计数和用户在活动中的选择
- android - 使 Lottie 动画仅在播放时可见
- google-maps-api-3 - 删除谷歌地图标记上的边界图标
- excel - 如何使用 VBA 将 Nuance Power PDF 中的注释字段中的文本导出到 Excel?
- ember.js - 迁移到组件的本机类时出现意外的令牌错误
- docker - Docker 运行到 Kubernetes 部署 yaml
- javascript - 如何比较来自更改事件的值
- ios - 滑动 ViewController 以关闭 - 顶部的错误
- asp.net - 为什么数据库没有变化