在Meteor的客户端和服务器上生成相同的随机数
使用Meteor,我需要一种方法在客户端和服务器上生成相同的随机数,这样我就可以从客户端方法的延迟补偿中获益。
我注意到meteor有一个随机包: http : //docs.meteor.com/#random
我不熟悉随机数字生成或encryption技术,我也不太了解随机数据包的一些Meteor文档,所以我有一些问题。
- 我可以使用这个包来实现我想要的吗?
- 如果是,我该如何使用它来做到这一点? 如果我在客户端上使用种子来生成随机数,然后发送种子到服务器重新生成相同的数字,那么不是一种不安全的方式来做到这一点…因为客户端不能被信任?
- 如果没有,是否有另一种方法来实现呢?
我的问题定义在步骤…
- 客户:生成种子
- 客户:从种子生成随机数
- 客户:发送种子到服务器
- 服务器:从种子生成随机数
- 失败…客户端生成的种子可以被窥视,并且可以被操纵
替代scheme:
- 客户:询问服务器的随机数
- 服务器:生成随机数
- 服务器:发送随机数到客户端
- 失败…往返意味着你不能利用meteor的延迟补偿
我的应用程序需要重复生成大量的随机数,所以我试图避免所有这些往返行程。
这取决于你想要实现什么样的事情,如果我们以MMO中的老虎机为例,一步一步做的是这样的:
- 用户点击“插入钱币”button
- 服务器接收用户为一个游戏支付的通知,游戏的结果被发送到客户端
- 客户端等待用户旋转机器并开始滚动
- 客户端显示等待用户动作+animation时收到的结果。
这有一个副作用:在用户开始旋转车轮之前,用户可以知道结果,但是在他付钱之后。
问题是,如果用户在select了随机数后select了不同的选项,他可以select成本最低的选项,如果他发现这个数字是不好的。 为了弥补这一点,每个随机行动需要创build自己的号码。
你可以看到这个模式,由查看游戏来源的用户查看他被游戏“欺骗”: Zoot Loot不是随机的
在一个叫做clickerheroes的flash游戏中,有一些动作会产生一个随机结果。 由于游戏每两分钟保存一次,并且不被服务器支持,所以随机数是预先生成的。 这可以防止窍门保存,尝试你的运气,加载回来,重试你的运气,因为相同的随机数字回来…
虽然这不能完全回答OP,但是我希望这有助于向用户提供值得信赖的随机数的逻辑。
你不能种子(你真的想做什么!)Math.random,我不认为随机包也不支持它。 您可以使用seedrandom.js ,并在服务器和客户端上使用seed 。
你试图做的是自然界的不安全。 如果您需要安全性,请致电服务器并等待响应。 randomiseralgorithm是可用的,发送种子给客户端或服务器打败这个愚蠢的防御尝试。
您绝对不应该信任来自客户端的数据,当您像服务器一样完成控制时,始终会validation环境中的所有内容。