在不同的独立设备上生成不同的随机有效日期?

时间:2010-05-26 13:39:57

标签: java algorithm concurrency mobile random

让我来描述一下这个系统。有几个移动设备,每个移动设备彼此独立,并且它们为相同的记录ID生成内容 我想避免为不同的设备上的相同记录生成相同的内容,为此我虽然我会使用随机的,并使其根据这些random集中内容池。

假设你有1到100的选择。

第1天

  • 设备#1将选择1-10之间的记录#33
  • 设备#2将选择40-50之间的记录#33
  • 设备#3将选择50-60之间的记录#33
  • 设备#1将选择40-50之间的记录#55
  • 设备#2将选择1-10之间的记录#55
  • 设备#3将选择10到10之间的记录#55

  • 设备#1将选择1-10之间的记录#11

  • 设备#2将选择1-10之间的记录#22
  • 设备#3将选择1-10之间的记录#99

第2天

  • 设备#1将选择90到90之间的记录#33
  • 设备#2将选择1-10之间的记录#33
  • 设备#3将选择50-60之间的记录#33

他们无法访问中央服务器 可用于每个人的数据:

  • IMEI(每部手机唯一)
  • 今天的日期(所有设备上相同)
  • 记录ID(所有设备上相同)

您怎么看?怎么可能?

PS。标签可以编辑

2 个答案:

答案 0 :(得分:3)

我同意AakashM和沮丧。首先,您能保证设备数量大于生成数据的范围吗?实际上,要成为“随机”,您确实需要将生成的内容作为设备的两倍,否则至少有一个设备必须在一个选项之间“随机选择”。这说明,因为IMEI是唯一基于设备的唯一数据,您必须在算法中使用它。另一个问题(我怀疑)是设备ID不一定是均匀分布的,因此任何设备ID到数据块的潜在映射都可能导致重叠(除非您有大量数据可供选择)或者生成的值不会均匀分布在设备池中。

这里说的是一个粗略的算法:

  1. 创建IMEI到整数的映射(即某种散列)
  2. 根据步骤
  3. 中生成的可能值的日期和大小旋转该整数
  4. 根据步骤#1创建的IMEI与值范围的比率,将数字从2的数字映射到一系列数据值。
  5. 使用标准随机数从该范围中选择
  6. 使用IMEI作为单字节且数据范围为0-> 2559的简单示例:

    1. 基于IMEI直接映射,因此base = IMEI
    2. 日期翻译基于纪元以来的#of天数。对于这个例子说700然后base =(9(原始基数:映射IMEI)+700(天数))%255(映射IMEI值的范围)= 199
    3. 数据范围是映射值范围的10倍,因此每个块可以使用10个值,结果数据范围从2变为1990 - > 1999(包括)。
    4. 在块数据范围内选择标准随机值(即4,由公平骰子滚动选择)值= 1990 + 4 = 1994.
    5. 最后,如果您希望范围根据记录而有所不同,您可以将其用作第二步中的第二个偏移量。

答案 1 :(得分:1)

如果每个设备都有唯一的DeviceID(可能基于硬件序列号或其他内容),您可以使用它而不是这些随机数方案。会让事情变得更简单。