C的rand()使用了哪些常用algorithm?

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

看到这篇文章: http : //en.wikipedia.org/wiki/List_of_random_number_generators

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

 /* Reentrant random function from POSIX.1c. Copyright (C) 1996, 1999, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include <stdlib.h> /* This algorithm is mentioned in the ISO C standard, here extended for 32 bits. */ int rand_r (unsigned int *seed) { unsigned int next = *seed; int result; next *= 1103515245; next += 12345; result = (unsigned int) (next / 65536) % 2048; next *= 1103515245; next += 12345; result <<= 10; result ^= (unsigned int) (next / 65536) % 1024; next *= 1103515245; next += 12345; result <<= 10; result ^= (unsigned int) (next / 65536) % 1024; *seed = next; return result; } 

来源: https : //sourceware.org/git/?p=glibc.git;a=blob_plain;f= stdlib/ rand_r.c;hb=HEAD

正如你所看到的,只是多了一个加法和换挡。 值是仔细select,以确保您不会重复RAND_MAX迭代的输出。

请注意,这是一个旧的实现已经被更复杂的algorithm取代: https : //sourceware.org/git/?p= glibc.git;a =blob_plain;f=stdlib/random_r.c;hb=HEAD

如果链接断了,Google for“glibc rand_r”

我曾经写过关于CRNGs的离散math课程报告。 为此,我在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(未经testing)…

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

PRNG(伪随机数发生器)领域相当广泛。

首先,你必须明白,没有外部input(通常是物理的),你不能得到一个真正的随机数来源。这就是为什么这些algorithm被称为伪随机 :他们通常使用种子来初始化一个位置很长的序列, 似乎是随机的,但它不是随机的。

最简单的algorithm之一是线性同余发生器 ( LCG ),它具有保证长序列的一些代价,并且根本不安全。

另一个有趣的(至less是名字)Blum Blum Shub Generator( BBS )对于普通的PRNG来说是不常见的,因为它依赖于模运算的幂运算,给出了与RSA和El Gamal等其他algorithm相媲美的安全性,如果我不确定它的证据)

如果你需要一些特定的或更高级的东西,你可以使用Boost Random库来处理不同的随机数生成器。

Boost Random的文档在这里 。