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

Javascript 在Meteor中的客户端和服务器上生成相同的随机数,javascript,node.js,random,meteor,Javascript,Node.js,Random,Meteor,使用Meteor,我需要一种方法在客户端和服务器上生成相同的随机数,这样我就可以从客户端方法的延迟补偿中获益 我注意到Meteor有一个随机包: 我不熟悉随机数生成或晶体摄影,也不太了解随机软件包的一些Meteor文档,所以我有一些问题 我可以用这个软件包来实现我想要的吗 如果是,我如何使用它来实现这一点?如果我在客户端使用一个种子来生成随机数,然后将该种子发送到服务器以重新生成相同的数,那么这不是一种隐含的不安全的方法吗。。。因为客户不可信 如果没有,是否有其他方法来实现这一点 我的问题分步定

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

我注意到Meteor有一个随机包:

我不熟悉随机数生成或晶体摄影,也不太了解随机软件包的一些Meteor文档,所以我有一些问题

  • 我可以用这个软件包来实现我想要的吗
  • 如果是,我如何使用它来实现这一点?如果我在客户端使用一个种子来生成随机数,然后将该种子发送到服务器以重新生成相同的数,那么这不是一种隐含的不安全的方法吗。。。因为客户不可信
  • 如果没有,是否有其他方法来实现这一点
  • 我的问题分步定义

  • 客户端:生成种子
  • 客户端:从种子生成随机数
  • 客户端:将种子发送到服务器
  • 服务器:从种子生成随机数
  • 失败。。。客户机生成的种子可以窥视,并且易于操作
  • 备选方案:

  • 客户端:向服务器请求随机数
  • 服务器:生成随机数
  • 服务器:向客户端发送随机数
  • 失败。。。往返意味着你不能利用流星的延迟补偿

  • 我的应用程序需要重复生成大量随机数,因此我正在尝试避免所有这些往返。

    你不能在Math.random中播种(你真正想做的!),我认为随机软件包也不支持它。您可以使用,并在服务器和客户端上使用相同的种子。

    这取决于您想要实现什么样的目标,如果我们以MMO中的老虎机为例,一步一步完成的是:

  • 用户点击“插入硬币”按钮
  • 服务器收到一个通知,通知用户为一个播放付费,播放结果将发送给客户端
  • 客户端等待用户旋转机器并开始滚动
  • 客户端显示它在等待用户操作+动画时收到的结果
  • 这有一个副作用:用户甚至可以在开始转动轮子之前就知道结果,但在他付钱之后

    问题是,如果用户在选择随机数后有不同的选项可供选择,那么如果用户发现随机数不好,他可以选择成本最低的选项。为了解决这个问题,每个随机操作都需要创建自己的编号

    您可以看到一个用户详细描述的模式,该用户查看了一个游戏的源代码,发现自己被游戏“欺骗”:

    在一款叫做clickerheroes的flash游戏中,有一些动作会产生随机结果。由于游戏每几分钟保存一次,并且没有服务器的支持,所以随机数是预先生成的。这会阻止保存、尝试运气、加载、重试运气的技巧,因为相同的随机数会回来


    虽然这并不完全符合OP的要求,但我希望它有助于为用户提供可靠的随机数据。

    您试图做的事情本质上是不安全的。如果需要安全性,请呼叫服务器并等待响应。randomiser算法可用,并将种子发送到客户端或服务器,以挫败这种愚蠢的防御尝试


    您永远不应该信任来自客户端的数据,当您拥有完全控制权(如服务器)时,请始终验证环境中的所有内容。

    “我需要一种方法在客户端和服务器上生成相同的随机数”-您需要这样做的事实表明您可能没有正确地解决问题……@MitchWheat您建议我如何解决问题?只需在服务器上生成并将结果发送给客户端(即权威)?我在尽量避免往返。。。不确定是否可能。我不确定问题出在哪里,但我怀疑答案是“使用GUID”。谢谢你的回答。我可能误解了工作流的一个关键部分,但是如果客户机正在生成种子(因为客户机操作首先发生),那么这是可以操纵的。仅当服务器生成种子时,此操作才有效。。。这就是我的困境,因为我试图利用Meteor的客户端延迟补偿,这实际上造成了一个鸡和蛋的问题。@Harley这够糟糕了吗?客户端可以窥视下一个随机数,或者服务器可以在客户端登录时在会话开始时生成种子,然后在会话期间存储它?每次客户端使用一个随机数时,服务器都会根据它自己的随机数进行检查。难道客户端不可能看到传入的种子并找出如何提前生成随机数,以便预测将要发生的事情吗?一位同事提出了一个替代方案。。。只需让客户端生成数字,并在最后将结果发送给服务器即可。如果服务器连续记录了3个积极结果,则假设用户“作弊”,并告诉客户机从那时起需要开始与服务器检查其结果。显然,只有在你不介意一点点“欺骗”的情况下,这才会起作用,但对于我的用例来说,这很好。@Harley是的,它会的。我想你必须让服务器生成随机数。最后我使用了客户端生成的随机数,这意味着我可以利用延迟补偿。但我也将结果异步发送到服务器。如果服务器看到用户获得了太多的积极结果,那么它会告诉用户的客户机首先通过服务器运行它的所有请求。因此,合法用户不会受到缓慢往返的惩罚——只会受到潜在的不可靠往返的惩罚。这个解决方案在一个完全不允许作弊的环境中是行不通的,但对我来说,少量的作弊是可以的