我了解C规范并未提供有关的具体实现的任何规范rand()。在不同的主要平台上通常使用哪些不同的算法?它们有何不同?
rand()
看到这篇文章: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
如您所见,它只是简单地乘以一个加法和一个移位。仔细选择这些值,以确保不会重复RAND_MAX迭代的输出。
请注意,这是一个较旧的实现,已被更复杂的算法取代:https : //sourceware.org/git/?p= glibc.git;a =blob_plain;f=stdlib/random_r.c;hb=HEAD
如果链接断开,则Google为“ glibc rand_r”