我正在寻找快速PRNG,以便我可以快速为对象创建(半)唯一ID。唯一性更多的是管理问题,ID复制只是极少数情况下的问题。
它必须尽可能快,因为性能至关重要,而且非顺序(如果ID是顺序的,则更有可能发生管理方面的错误)。此外,我希望避免使用较低的数字,但只需重试,直到检索到足够多的数字,就可以轻松减轻这种情况。
修改 我还要补充一点,我要求ID为32位,因此GUID不起作用,需要独立于平台(目前正在PC上实现,但也需要在Nintendo DS,PSP,PS3,Wii,Xbox等上工作)平台)。此外,它可能每秒被调用数千次,因此,基于输入的随机数生成是不可行的。
由于
答案 0 :(得分:3)
GUIDs?许多环境都支持生成这些。
答案 1 :(得分:1)
如果你真的只需要非顺序部分,那么X[i] = (X[i-1] + a) mod b
有什么问题?如果a和b是共质数,则将重复周期b。这使得b = 2 ^ 32是一个简单的选择,而a可以是任何素数> 2.性能将以MHz为单位,而不是KHz。
避免使用较低的数字也很简单:使用序列X[i] = offset + (X[i-1] - offset + a) mod b
?
答案 2 :(得分:0)
我不确定我是否正确,但是如果你在Linux机器上,你可以从/ dev / urandom读取以获得高质量随机数的流。这些数字可用于生成您需要的任何长度字符串。 请记住,要使此解决方案正常工作,机器应接收用户的输入(键盘/鼠标)。
答案 3 :(得分:0)
PRNG的最佳算法是您的编程语言已经提供的任何库。它将有一个经过良好测试的算法,可能会很聪明地使用计算机中的现有随机源,如/ dev / random。
如果你想要“低数字”,不要只是重试,直到你得到一个;这需要永远。只需取随机数并按天花板调整即可。即:
random() % 1000000
返回0到999,999之间的随机数。
答案 4 :(得分:0)
这可能有效:
自纪元以来的当前时间总和,线程ID和序号。
答案 5 :(得分:0)
答案 6 :(得分:0)
Fishman和Moore写了一篇关于线性同余PRNG(A(x) = A(x-1)|m
)的论文。 This posting on Stackoverflow讨论了这种算法。如果您的平台都支持64位累加器以获得中间结果(所有现代C编译器都应支持64位long long
变量)那么这很简单快速,周期为2 ^ 30,M = 2 ^ 31-1。上面链接的帖子在Fishman和Moore的论文中有一些很好的A值。
答案 7 :(得分:0)
试试this。由George Marsaglia友情提供。
无法争辩每秒20亿随机数。
答案 8 :(得分:-1)
如果问题是某些对象或线程生成的ID与其他对象或线程相同,请考虑在这些ID上填充10k保留的子ID。
如果您从先前的ID生成随机ID,则由于prng是确定性的,因此它将是同样的问题。即id 25653将始终在接下来生成id 7567832。总是。
您可能会考虑仅将prng用于非标准ID生成,例如生成ID的对象。例如观察在什么情况下会发生这些冲突,并通过prng解决这些情况。其余的可能安全地是顺序的。