首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何廉价地从一个动态数组中进行选择,其中有一个甲骨文生成的种子数,并且是可靠的?

问如何廉价地从一个动态数组中进行选择,其中有一个甲骨文生成的种子数,并且是可靠的?
EN

Ethereum用户
提问于 2020-12-13 06:21:35
回答 1查看 622关注 0票数 0

在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,这样就不会除以零或小于数组长度(没有余数)。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2020-12-13 22:46:43

好的维贝斯是对的。莫杜洛你就完了。

讨论给我的印象是,您不完全理解余数函数是如何解决它的。没有除以零,不需要乘以x10,只需:

random % array.length和您将得到一个从0到array.length-1的数字,这正是您想要的。

代码语言:javascript
复制
0 % <anything> = 0
3 % 9 = 3
23 % 23 = 0
24 % 23 = 1
1212121212456453535356453121212121 % 23 = something from 0-22

当然,这不是免费的,但这是一个简单的数学操作。使过程复杂化的进一步努力可能会增加昂贵的步骤,而不是提高性能。

这和给它喂食的随机数一样随机。

希望能帮上忙。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/91077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档