我想用 C 语言创建一个快速的轻量级函数,它返回一个伪随机无符号字符。对我(ANSI C 程序员)来说,具有挑战性的部分是我不能使用 the<stdio.h>
或任何其他现成的函数。有什么建议么..?
“快速”是指:避免不必要的代码(例如 if 语句、循环等) “轻量级”是指:尽可能少地使用变量
谢谢
来自linux内核源代码(random32.c)
rnd_state 中的值应初始化为:s1 > 1, s2 > 7, s3 > 15。
该论文声称这是一个基于 GNU Scientific Library 1.5(2004 年 6 月 30 日)代码的最大等分布组合 Tausworthe 生成器
struct rnd_state {
u32 s1, s2, s3;
};
static u32 __random32(struct rnd_state *state)
{
#define TAUSWORTHE(s,a,b,c,d) ((s&c)<<d) ^ (((s <<a) ^ s)>>b)
state->s1 = TAUSWORTHE(state->s1, 13, 19, 4294967294UL, 12);
state->s2 = TAUSWORTHE(state->s2, 2, 25, 4294967288UL, 4);
state->s3 = TAUSWORTHE(state->s3, 3, 11, 4294967280UL, 17);
return (state->s1 ^ state->s2 ^ state->s3);
}
学术界:http ://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme.ps
例如
uint32_t state = 777;
char myRand()
{
state = state * 1664525 + 1013904223;
return state >> 24;
}
请注意,myRand
返回高位,它们比低位更伪随机。
线性同余发生器由 DH Lehmer 在 1949 年引入(参见 Proc. 2nd Symp. on Large-Scale Digital Calculating Machinery (Cambridge, MA: Harvard University Press, 1951), 141-146)。我给出的具体数字常数似乎来自 Press, William H.;等。(1992)。Fortran 77 中的数值配方:科学计算的艺术(第 2 版)。国际标准书号 978-0-521-43064-7。
发明你自己的随机数生成器与发明你自己的密码学是同一类的一个坏主意:很容易构造一些看起来可以完成工作但实际上效率极低的东西;构建真正可以完成工作的东西要困难得多。阅读RANDU的警示故事,然后下载Mersenne Twister的一种变体并使用它。
维基百科上有一个伪随机数生成器的完整列表:http ://en.wikipedia.org/wiki/List_of_pseudorandom_number_generators