2011-07-01 39 views
1

我有2个设备,我正在寻找一种方法来同步它们之间的随机数生成。同步随机数

更多背景:2个设备连接,一个设备发送包含数据集合中的其他文件。数据集然后加载到两个设备上。数据以各种级别随机显示。我希望显示器在设备之间同步,但仍然是随机的。

的概念性的一例:拍摄照片的堆叠。堆栈的副本被发送到远程设备并存储以备将来使用。然后在两个设备上以相同的方式对栈进行混洗,以便在每个设备上绘制第一张图片将产生相同的输出。这是过分简化,我的应用程序中需要更多的随机数,所以优化,如共享排序顺序不适用...

打破:我需要一个简单的方法来从相同的随机数池在2个设备上。我不知道在设备同步之前可能会出现多少次随机抽签,但是一旦同步,应该可以预测,他们将使用相同数量的随机数,因为它们使用的是相同的数据集,但是有机会抽取更多在进行下一批处理之前(这将需要随机数据的重新同步)。

我期待,以避免传递排序顺序,位置信息等,在数据集中显示时(这也引起了关注结构性自项目最初并非设计来共享信息已经被传每个实体),因为能够生成相同的位置,这要求随机数字以相同的顺序出现。

任何想法或建议,将不胜感激。

+0

感谢所有的回复。我最初的尝试(在两台设备上使用相同的种子)都被我没有追踪到的东西抛弃,但现在我意识到了,所以只要设置种子就应该工作,一旦我理清什么是抛出它(我可能是重置它我还没找到的地方...)。然而,一旦我开始移植这个系统跨平台,我认为OscarMk对实施我自己的LCG的建议将成为最小化操作系统与操作系统不一致等等的方式。感谢所有的答复! – ima747

+0

我试着完全一样,有些测试人员报告说有时随机生成的元素不同步。这非常好,因为我在使用rand()之后才开始种子,所以不知道那里发生了什么。难道不同的iDevices(或iDevices vs模拟器)有不同的rand()实现吗? –

回答

8

您可以使用LCG算法,并为产生相同的种子。由于LCG算法是确定性的,只要您使用相同的种子对两个设备进行种子处理,它们就会产生完全相同的伪随机数。

您可以找到LCG算法这里的更多信息:

Linear congruential generator

这LCG是用于例如通过java.util.Random的。

1

如果你在每个设备上给rand()同样的种子,即srand(SEED);,那么出来的(伪)随机数保证每次都是一样的,并且你可以保持无限制地将数字拔出而不需要重新播种。

+0

这就是我的想法,但没有看到结果,但进一步的测试表明,我在其他地方出现了一个小故障,正在抛弃它。 – ima747

1

大多数随机数发生器让你设置“种子”。如果您创建两个随机数生成器,在两台不同的机器上执行完全相同的生成算法(甚至不需要是相同类型或运行相同的操作系统),然后为两台机器提供相同的“种子”值,它们将两者都产生完全相同的随机数字序列。

所以你的“同步”应该真的只需要从第一机器传输一个数字(通常本身就是一个随机选择的号码)到第二。然后两台机器使用与“种子”相同的数字。

(我仰望的iPhone随机数生成器的细节,但苹果文档的网站显然已经受到明尼苏达州政府关门。)

0

如果你并不总是要指定的种子,你可以简单地指定一个设备作为主设备。当主设备产生一个随机数时,它向包含该随机数的另一设备发送消息。

+0

这我相信需要在客户端保留一个随机数列表,并从中取出,这意味着主服务器总是必须在客户端之前生成。在我目前的安排下,没有指定的主人,这会使事情进一步复杂化。 – ima747