使用 Meteor,我需要一种方法在客户端和服务器上生成相同的随机数,这样我就可以获得客户端方法的延迟补偿的好处。
我注意到 Meteor 有一个随机包:http://docs.meteor.com/#random
我不熟悉随机数生成或密码学,而且我不太了解 Random 包的一些 Meteor 文档,所以我有一些问题。
- 我可以使用这个包来实现我想要的吗?
- 如果是,我该如何使用它来做到这一点?如果我在客户端上使用种子来生成随机数,然后将该种子发送到服务器以重新生成相同的数字,那么这不是隐式不安全的方式吗...因为客户端不可信?
- 如果没有,还有其他方法可以实现这一目标吗?
我的问题定义步骤...
- 客户端:生成种子
- 客户端:从种子生成随机数
- 客户端:将种子发送到服务器
- 服务器:从种子生成随机数
- 失败...客户端生成的种子可以被偷看并且可以被操纵
替代方案:
- 客户端:向服务器请求随机数
- 服务器:生成随机数
- 服务器:向客户端发送随机数
- 失败...往返意味着您无法利用 Meteor 的延迟补偿
我的应用需要重复生成大量随机数,因此我试图避免所有这些往返。
最佳答案
这取决于你想要实现什么样的事情,如果我们以MMO中的老虎机为例,一步一步完成的事情是这样的:
- 用户点击“插入硬币”按钮
- 服务器收到用户支付一场比赛的通知,比赛结果发送给客户端
- 客户端等待用户旋转机器并开始滚动
- 客户端显示在等待用户操作 + 动画时收到的结果。
这有一个副作用:用户在开始转动轮子之前、但在付费之后就可以知道结果。
问题是,如果用户在选择随机数后有不同的选项可供选择,那么如果他发现该数字不好,他可以选择成本最低的选项。为了解决这个问题,每个随机操作都需要创建自己的编号。
您可以看到一个用户详细描述了这个模式,他查看了游戏的源代码,发现自己被游戏“欺骗”了:Zoot Loot is Not Random
在一款名为 Clickerheroes 的 Flash 游戏中,有些 Action 会产生随机结果。由于游戏每几分钟保存一次,并且没有服务器支持,因此随机数是提前生成的。这可以防止保存、试试你的运气、加载回来、在相同的随机数返回时重试你的运气......
虽然这并不能完全回答OP,但我希望它有助于为用户提供值得信赖的随机数。
关于javascript - 在 Meteor 中在客户端和服务器上生成相同的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23730079/