C'使用了哪些常用算法;s兰德()?

C'使用了哪些常用算法;s兰德()?,c,algorithm,random,platform,C,Algorithm,Random,Platform,我知道C规范没有给出任何关于rand()的具体实现的规范。在不同的主要平台上通常使用哪些不同的算法?它们有何不同?请参阅本文: 这是glibc的rand()的源代码: POSIX.1c中的可重入随机函数。 版权所有(C)1996, 1999, 2009免费软件基金会。 此文件是GNUC库的一部分。 由Ulrich Drepper提供,1996年。 GNUC库是自由软件;您可以重新分发它和/或 根据GNU小公众的条款对其进行修改 自由软件基金会发布的许可证;任何一个 许可证的2.1版,或(由您选择

我知道C规范没有给出任何关于
rand()
的具体实现的规范。在不同的主要平台上通常使用哪些不同的算法?它们有何不同?

请参阅本文:

这是glibc的
rand()
的源代码:

POSIX.1c中的可重入随机函数。 版权所有(C)1996, 1999, 2009免费软件基金会。 此文件是GNUC库的一部分。 由Ulrich Drepper提供,1996年。 GNUC库是自由软件;您可以重新分发它和/或 根据GNU小公众的条款对其进行修改 自由软件基金会发布的许可证;任何一个 许可证的2.1版,或(由您选择)任何更高版本。 分发GNU C库是希望它会有用, 但无任何保证;甚至没有任何关于 适销性或适合某一特定目的。见GNU 有关更多详细信息,请参阅较低的通用公共许可证。 您应该已经收到GNU Lesser General Public的副本 许可证以及GNUC库;如果没有,写信给免费的 软件基础,公司,59庙广场,套房330,波士顿,MA 02111-1307美国*/ #包括 /*该算法在ISO C标准中有提及,这里是扩展的 对于32位*/ int 随机数(无符号整数*种子) { 无符号整数next=*种子; int结果; 下一个*=1103515245; 下一个+=12345; 结果=(无符号整数)(next/65536)%2048; 下一个*=1103515245; 下一个+=12345;
结果如果您需要一些特定的或更高级的东西,您可以为不同的随机数生成器使用Boost随机库

Boost-Random的文档是。

伪随机数发生器(prng)的领域相当广泛

首先,你必须明白,如果没有外部输入(通常是物理输入),你就无法获得真正的随机数来源。这就是为什么这些算法被称为伪随机算法:它们通常使用种子来初始化一个看似随机但根本不是随机的很长序列中的位置

最简单的算法之一是线性同余生成器(),它有一些代价来保证一个长序列,而且根本不安全


另一个有趣的(至少就名称而言)是Blum-Blum-Shub生成器(),这对于普通PRNG来说是不寻常的,因为它依赖于模运算中的幂运算,在破坏序列时提供了与其他算法(如RSA和El Gamal)相当的安全性(如果我不确定它的证明的话)

我曾经为离散数学课程写过一篇关于CRNGs的报告。为此,我在msvcrt.dll中反汇编了rand()


msvcrt.dll:77C271D8 mov     ecx, [eax+14h]
msvcrt.dll:77C271DB imul    ecx, 343FDh
msvcrt.dll:77C271E1 add     ecx, 269EC3h
msvcrt.dll:77C271E7 mov     [eax+14h], ecx
msvcrt.dll:77C271EA mov     eax, ecx
msvcrt.dll:77C271EC shr     eax, 10h
msvcrt.dll:77C271EF and     eax, 7FFFh
所以这是一个LCG类似(未经测试)


就是这样?非常简单。非常感谢。是的,就是这样,大多数通用PNRG实现起来非常简单。如果你想要更复杂的东西,试试Mersenne Twister。甚至MT19937也不难实现。下面通过@Tiemen:@Aaron我无法评论,但RAND_MAX是返回的最高值,而不是nu重复之前的迭代次数。@Jason:有链接吗?我的印象是RAND_MAX调用不会重复(当然,除非您更改种子)。主要注释是RAND()只是伪随机的,通常甚至不是一个很好的伪随机生成器。C标准建议了一个可能的实现,许多实现都使用它。正如其他人所指出的,还有很多其他的。只需确保在需要加密随机性的情况下不使用基本的随机函数。C源代码因为微软C++运行时库是MSDN的一部分,RAND()/SRAND()包含在那里。例如,在这里使用MyStftRand的实现:/BoADRGEG/PIIMACHYMICROSOFTFRIECELLUBARED。C AT AT =主机(短URL)。它的C问题不是C++,Boost不能使用。

msvcrt.dll:77C271D8 mov     ecx, [eax+14h]
msvcrt.dll:77C271DB imul    ecx, 343FDh
msvcrt.dll:77C271E1 add     ecx, 269EC3h
msvcrt.dll:77C271E7 mov     [eax+14h], ecx
msvcrt.dll:77C271EA mov     eax, ecx
msvcrt.dll:77C271EC shr     eax, 10h
msvcrt.dll:77C271EF and     eax, 7FFFh

int ms_rand(int& seed)
{
  seed = seed*0x343fd+0x269EC3;  // a=214013, b=2531011
  return (seed >> 0x10) & 0x7FFF;
}