【发布时间】: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