【问题标题】:How to generate a collection of random numbers based on a single random seed如何基于单个随机种子生成随机数集合
【发布时间】:2022-01-06 14:33:42
【问题描述】:

我正在研究通过使用 Oracle 来利用随机数的可靠合约。 (链环)。显然,考虑到获得随机数所需的价格和时间,我正在寻找重用该种子以生成超过 1 个随机数的最佳方法。

我有以下代码,每个循环应该生成 2 个随机数 1 介于 0 和 99 之间,另一个介于 0 和 2 之间。所以本例中总共有 20 个随机数。

uint256 randomness = 78076127350936886139585537764964110448646985064549445555744769369952641998556;
for (uint256 i = 0; i < 10; i++) {
  uint8 random1 = SafeCast.toUint8((randomness % (100 + i)) % 100)
  uint8 random2 = SafeCast.toUint8((randomness % (100 + i)) % 3)
}

似乎工作正常,但想确定这在数学上是否有意义,或者是否有更好的方法。

【问题讨论】:

  • 你对随机性的处理让我想起了这一点:xkcd.com/221
  • @JohnColeman 要明确随机性种子是由 chainlink oracle 提供的。为了清楚起见,我在这里对其进行了硬编码。
  • 似乎有可能使用像这样的模运算将创建modulo bias(尤其是使用 %3),并且可能还会引入连续数字之间的相关性。或许您可以添加random 标签以引起具有 RNG 专业知识的人的注意。
  • 您可能比阅读 Daniel Lemire 关于该主题的出色的 Fast Random Integer Generation in an Interval 研究论文做得更糟。它于 2018 年发布,因此是相当最新的。
  • 能否请您帮助理解为什么不能使用 256 位随机性来播种 prng?如果您需要创建 8 位随机数,您可以将您的 256 位随机数拆分为 256/8=32 个片段,所有片段仍然是随机的。

标签: math random solidity random-seed


【解决方案1】:

找到有关如何执行此操作的文档。

https://docs.chain.link/docs/chainlink-vrf-best-practices/#getting-multiple-random-numbers

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

【讨论】:

    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2013-08-23
    • 2017-08-29
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多