2009-08-12 80 views
1

我正在寻找一个快速的PRNG,以便我可以快速创建(半)唯一的ID对象。唯一性更多的是管理问题,身份证复制只是极少数情况下的一个问题。什么是一个好的,快速的PRNG(非加密安全)

它必须尽可能快,因为性能至关重要,而且是非顺序的(如果ID是连续的,则更可能发生管理方面的错误)。另外,我希望避免使用较低的数字,但只要重试直到检索到足够高的数字,就可以轻松地减轻这种影响。

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

感谢

+0

你在用什么语言/系统? – 2009-08-12 13:50:42

+0

@John:那会影响算法太多,不是吗? – 2009-08-12 13:56:18

+0

所以你想要一个prng的算法,而不是一个快速的实现。 – 2009-08-12 13:57:34

回答

0

这可能会实现:

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

+0

这是一个好主意,没有真正想到使用线程ID之类的东西。虽然这在所有平台上都不可用,但我应该能够从散布在系统周围的变量(例如当前扫描行号和从简单栈走得到的值)中获取一点点随机数据。 – 2009-08-12 14:15:23

+1

这是一个可怕的答案,因为它将主要是一个顺序流(时间不一定会改变,我不明白为什么线程ID会根本改变) – 2014-02-17 21:04:47

+0

@StevenLu,我同意。这是一个可怕的答案!我甚至不记得那样写... – 2014-02-21 08:45:12

0

我不知道我是否正确,但是如果您在Linux机器上,则可以从/ dev/urandom中读取以获取高质量随机数字流。这些数字可用于生成您需要的任何长度的字符串。请记住,要使此解决方案起作用,机器应接收来自用户(键盘/鼠标)的输入。

0

您的PRNG的最佳算法是您的编程语言已提供的任何库。它将有一个经过良好测试的算法,并且可能会聪明地使用计算机中的现有随机源(如/ dev/random)。

如果你想要“低数字”,不要只是重试,直到你得到一个;这将永远占用。只需要随机数字,并通过天花板进行修改。即:

random() % 1000000 

返回一个介于0和999,999之间的随机数。

+1

但这些通常的方式来减慢,再加上我不需要它是一个高品质的随机,只是随机的。另外,我正在使用C++,其中唯一的标准算法是'rand()',它在很多平台上都被打破,并且速度可能很慢。 – 2009-08-12 14:11:12

+2

“PRNG的最佳算法是您的编程语言已提供的任何库。” - 那个人真是太错了,甚至不好笑。您可以参考基本上PRNG上的每一个来源来确保。 – 2009-08-28 11:07:03

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

+1

是不是这只是基本上连续的,但一步一个? – 2009-08-12 18:56:25

+1

当然。但考虑到这个问题,这可能已经足够好了。关键是:不要过度设计。 – MSalters 2009-08-13 09:37:40

+0

+1 - 另外,谷歌'鱼人和摩尔'为a和b的一套很好的价值。 – ConcernedOfTunbridgeWells 2009-08-28 10:55:41

0

菲什曼和Moore写了一篇关于线性同余的PRNG(A(x) = A(x-1)|m)。 This posting on Stackoverflow讨论了这个算法。如果你的平台都支持64位累加器来获得中间结果(64位long long变量应该在所有现代C编译器上都支持),那么这很简单快捷,2^30的周期为M = 2^31-1。上面链接的帖子中有一些来自Fishman和Moore论文的A值。

0

尝试this。由George Marsaglia提供。

不能争论每秒20亿个随机数。

+0

是的,如果我只需要处理支持SSE的处理器,那就太棒了。不幸的是,我处理的是x86(其中许多是修剪到最低限度的功能),PowerPC,Arm,MIPS和Cell处理器(以及其他几个有时)。 – 2014-02-20 03:15:54

+0

只需使用一个不太优化的Marsaglia RNG即可。 – 2014-02-20 09:28:09

相关问题