在Meteor的客户端和服务器上生成相同的随机数

使用Meteor,我需要一种方法在客户端和服务器上生成相同的随机数,这样我就可以从客户端方法的延迟补偿中获益。

我注意到meteor有一个随机包: http : //docs.meteor.com/#random

我不熟悉随机数字生成或encryption技术,我也不太了解随机数据包的一些Meteor文档,所以我有一些问题。

  1. 我可以使用这个包来实现我想要的吗?
  2. 如果是,我该如何使用它来做到这一点? 如果我在客户端上使用种子来生成随机数,然后发送种子到服务器重新生成相同的数字,那么不是一种不安全的方式来做到这一点…因为客户端不能被信任?
  3. 如果没有,是否有另一种方法来实现呢?

我的问题定义在步骤…

  1. 客户:生成种子
  2. 客户:从种子生成随机数
  3. 客户:发送种子到服务器
  4. 服务器:从种子生成随机数
  5. 失败…客户端生成的种子可以被窥视,并且可以被操纵

替代scheme:

  1. 客户:询问服务器的随机数
  2. 服务器:生成随机数
  3. 服务器:发送随机数到客户端
  4. 失败…往返意味着你不能利用meteor的延迟补偿

我的应用程序需要重复生成大量的随机数,所以我试图避免所有这些往返行程。

这取决于你想要实现什么样的事情,如果我们以MMO中的老虎机为例,一步一步做的是这样的:

  1. 用户点击“插入钱币”button
  2. 服务器接收用户为一个游戏支付的通知,游戏的结果被发送到客户端
  3. 客户端等待用户旋转机器并开始滚动
  4. 客户端显示等待用户动作+animation时收到的结果。

这有一个副作用:在用户开始旋转车轮之前,用户可以知道结果,但是在他付钱之后。

问题是,如果用户在select了随机数后select了不同的选项,他可以select成本最低的选项,如果他发现这个数字是不好的。 为了弥补这一点,每个随机行动需要创build自己的号码。

你可以看到这个模式,由查看游戏来源的用户查看他被游戏“欺骗”: Zoot Loot不是随机的

在一个叫做clickerheroes的flash游戏中,有一些动作会产生一个随机结果。 由于游戏每两分钟保存一次,并且不被服务器支持,所以随机数是预先生成的。 这可以防止窍门保存,尝试你的运气,加载回来,重试你的运气,因为相同的随机数字回来…

虽然这不能完全回答OP,但是我希望这有助于向用户提供值得信赖的随机数的逻辑。

你不能种子(你真的想做什么!)Math.random,我不认为随机包也不支持它。 您可以使用seedrandom.js ,并在服务器和客户端上使用seed 。

你试图做的是自然界的不安全。 如果您需要安全性,请致电服务器并等待响应。 randomiseralgorithm是可用的,发送种子给客户端或服务器打败这个愚蠢的防御尝试。

您绝对不应该信任来自客户端的数据,当您像服务器一样完成控制时,始终会validation环境中的所有内容。