一尘不染

C的rand()使用哪些常用算法?

algorithm

我了解C规范并未提供有关的具体实现的任何规范rand()。在不同的主要平台上通常使用哪些不同的算法?它们有何不同?


阅读 244

收藏
2020-07-28

共1个答案

一尘不染

看到这篇文章: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”

2020-07-28