/* 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;
}
3条答案
按热度按时间im9ewurl1#
参见本文:http://en.wikipedia.org/wiki/List_of_random_number_generators
这是glibc的
rand()
的源代码:来源: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
如果链接断开,请搜索"glibc rand_r"
muk1a3rh2#
我曾经为一门离散数学课程写过一篇关于CRNG的报告,为此,我在msvcrt.dll中分解了兰德():
所以这是一个LCG类似的东西(未经测试)...
bjp0bcyl3#
伪随机数发生器(PRNG)的领域相当广阔。
首先,你必须明白,没有外部输入(通常是物理的),你不能得到一个真实的的随机数源..这就是为什么这些算法被称为 * 伪随机 *:他们通常使用种子来初始化一个很长序列中的一个位置,这个序列看起来是随机的,但实际上不是随机的。
最简单的算法之一是Linear Congruential Generator(LCG),它有一些约束以保证长序列,并且它根本不安全。
另一个有趣的(至少名字)是Blum Blum Shub Generator(BBS),这是不寻常的正常PRNG,因为它依赖于求幂在模算术提供了一个安全性可比的其他算法,如RSA和El Gamal在打破序列(如果我不知道它的证明)