什么是好,速度快PRNG(非加密安全)(What is a good, fast PRNG (non

2019-09-23 05:51发布

我在寻找一个快速的PRNG,这样我可以快速创建对象(半)唯一的ID。 该独特性更是一个管理问题,并重复ID只在极少数情况的问题。

它必须尽可能快,因为性能是至关重要的,非顺序(如果ID是连续的,这使得它更可能是可以发生在管理方面的错误)。 另外,我想避免较低的数字,但可以很容易地只重试减轻,直到足够多的被检索。

编辑我还要补充一点,我需要的ID是32位的,因此GUID的不工作,需要独立于平台(目前正在实施的PC,还需要对任天堂的DS,PSP,PS3,Wii游戏机,Xbox和工作其他平台)。 此外,它可以被称为每秒数千次,因此,基于输入的随机数生成是不可行的。

谢谢

Answer 1:

这可能会实现:

的纪元以来,线程ID和序列号当前时间总和。



Answer 2:

GUID的 ? 许多环境都产生这些支持。



Answer 3:

我不知道我得到了你的权利,但如果你是在Linux中,您可以从/ dev / urandom的阅读,以获得高品质的随机数流。 这些数字可以用来生产需要任意长度的字符串。 请记住,此解决方案的工作,机器应该从用户(键盘/鼠标)接收输入。



Answer 4:

为您的PRNG的最佳算法是什么库的编程语言已经提供。 这将有一个很好的测试算法,并很可能会聪明地使用随机性的现有资源在你的电脑像/ dev /随机的。

如果你想“低的数字”,不只是重试,直到你得到一个; 将采取永远。 简单地采取随机数,并通过你的天花板国防部它。 即:

random() % 1000000

返回0和999999之间的随机数。



Answer 5:

如果你真的只需要通过非顺序的一部分,这有什么错X[i] = (X[i-1] + a) mod b ? 如果A和B是共同的素数,这将重复与区间b。 这使得B = 2 ^ 32的容易的选择,而可以是任何素> 2.性能会以MHz来测量,而不是千赫。

避免较低的数字也简单:使用序列X[i] = offset + (X[i-1] - offset + a) mod b



Answer 6:

请参阅: http://www.number.com.pt/index.html



Answer 7:

菲什曼和Moore写了关于线性同余的PRNG纸( A(x) = A(x-1)|m )。 #2本贴讨论了该算法。 如果你的平台可以支持所有中间结果(64位64位累加器long long变量应在所有现代C编译器支持),那么这是简单和快速的,周期为2 ^ 30与M = 2 ^ 31-1 。 以上链接的帖子有一个从菲什曼和Moore的纸一些良好的价值观。



Answer 8:

试试这个 。 乔治马尔萨利亚的礼貌。

不能与每秒2张十亿随机数争辩。



Answer 9:

如果问题是,一些对象或线程产生相同ID作为其他物体或线程,考虑填充这些ID与说10K保留孩子的ID。

如果您选择生成从以前的ID随机IDS,它的将是同样的问题,因为是的PRNG确定性。 即ID 25653总是会生成ID 7567832未来。 总是。

你可以考虑只使用PRNG为非标准ID生成这样生成的ID对象。 像下会发生什么样的条件,这些冲突观察和用PRNG解决这些情况。 其余的可以安全地连续的,大概。



文章来源: What is a good, fast PRNG (non-cryptographically secure)
标签: random