在JS中,您可以使用它并将其称为一天。
let randomArrayEntry = myArray[Math.floor(Math.random() * myArray.length)];
但是,在稳健性中,一切都是确定性的,除非为随机数调用外部函数。理论上很容易,但问题是,选择一个与数组长度匹配的数字是不现实的。
如果我的数组长度为23,并且甲骨文发出1823792836199027320224作为种子,我们可以将其降到最后两个数字% 10**2。现在我们有了数字24,我们现在有一个范围从0到99的可能的数字。那么,我们如何公平地使用这个数字从数组中选择,而不花费大量的气体来迭代呢?
我想出的第一个解决方案是检查一行中的前两个小于24的数字,然后这就是答案。问题是,随机生成的数字在一行中可能没有小于我们数组长度的任何两个数字。如果我们的数字是2或3,这就变得更有可能了。事务将不得不恢复或获取另一个随机数作为后盾。这似乎是个糟糕的计划。
编辑1:
当前的解决方案(在后面找到)是只取剩余部分。
uint256 randomArrayEntry = (randomNumber + myArray.length + 10) % myArray.length;
将随机数乘以10,这样就不会除以零或小于数组长度(没有余数)。
发布于 2020-12-13 22:46:43
好的维贝斯是对的。莫杜洛你就完了。
讨论给我的印象是,您不完全理解余数函数是如何解决它的。没有除以零,不需要乘以x10,只需:
random % array.length和您将得到一个从0到array.length-1的数字,这正是您想要的。
0 % <anything> = 0
3 % 9 = 3
23 % 23 = 0
24 % 23 = 1
1212121212456453535356453121212121 % 23 = something from 0-22当然,这不是免费的,但这是一个简单的数学操作。使过程复杂化的进一步努力可能会增加昂贵的步骤,而不是提高性能。
这和给它喂食的随机数一样随机。
希望能帮上忙。
https://ethereum.stackexchange.com/questions/91077
复制相似问题