我有2个设备,我正在寻找一种方法来同步他们之间的随机数生成。
更多背景信息:两台设备连接,一台设备向另一台设备发送包含数据集的文件。然后数据集加载到两台设备上。数据在不同级别随机显示。我希望显示在设备之间同步,但仍然随机。
概念示例:取一个图片堆栈。堆栈的副本被发送到远程设备并存储以备将来使用。然后堆栈在两个设备上以相同的方式进行混洗,以便在每个设备上绘制第一张图片将导致相同的输出。这过于简化,我的应用程序中需要更多的随机数,因此共享排序顺序等优化不适用...
分解:我需要一个简单的方法来从2个设备上的相同随机数池中抽取。我不知道设备同步之前可能会发生多少次随机抽取,但一旦同步,应该可以预测他们将抽取相同数量的随机数,因为他们使用的是相同的数据集,然而,在进行到下一批之前,存在一个可能比另一个抽取更多的机会(这将需要随机数据的重新同步)。
我希望通过能够生成相同的位置,这需要随机数以相同的顺序出现,从而避免在显示时为数据集中已经传输的每个实体传输排序顺序、位置信息等(这也会引起结构性问题,因为项目最初并没有设计为共享该信息)。
如有任何想法或建议,我们将不胜感激。
5条答案
按热度按时间vngu2lb81#
您可以使用LCG算法并为生成设置相同的种子。由于LCG算法是确定性的,因此只要使用相同的种子为两个设备设置种子,它们将生成完全相同的伪随机数。
您可以在此处找到有关LCG算法的详细信息:
Linear congruential generator
例如,java.util.Random使用了这个可装码组。
ebdffaop2#
如果您在每个设备上为
rand()
提供相同的种子,即srand( SEED );
,则每次产生的(伪)随机数都保证是相同的,并且您可以无限期地提取数字而无需重新播种。fslejnso3#
大多数随机数生成器允许您设置“种子”。如果您在两台不同的机器上创建两个随机数生成器,实现完全相同的生成算法(甚至不需要是相同的类型或运行相同的操作系统),然后为这两台机器提供相同的“种子”值,它们都将产生完全相同的随机数序列。
所以你的“同步”只需要把一个数字(通常是随机选择的数字)从第一台机器传送到第二台机器,然后两台机器都用这个数字作为“种子”。
(我会去查iPhone随机数生成器的细节,但苹果文档网站显然受到了明尼苏达州政府关闭的影响。)
xpcnnkqh4#
如果您不想总是指定种子,您可以简单地指定一个设备为主设备。当主设备生成随机数时,它会向另一个设备发送包含该随机数的消息。
dnph8jn45#
如果它是真正随机的,那么没有一个种子数会在第二台机器上产生相同的数。这意味着随机理论和混沌理论都适用。