C自定义随机功能

时间:2011-06-20 20:31:09

标签: c random srand

我想在C语言中创建一个快速轻量级函数,它返回一个伪随机unsigned char。对我来说很有挑战性的部分(ANSI C程序员)是我不能使用<stdio.h>或任何其他现成的函数。有什么建议..?

by“fast”我的意思是:避免不必要的代码(例如if语句,循环等) 通过“轻量级”我的意思是:使用尽可能少的变量

感谢

4 个答案:

答案 0 :(得分:4)

从linux内核源代码(random32.c)

rnd_state中的值应该初始化为:s1&gt; 1,s2> 7,s3&gt; 15。

该论文声称这是一个最大度等分的组合Tausworthe发生器 基于GNU Scientific Library 1.5(2004年6月30日)的代码

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

答案 1 :(得分:4)

Use a Linear Congruential Generator

E.g。

uint32_t state = 777;

char myRand()
{
   state = state * 1664525 + 1013904223;
   return state >> 24;
}

注意myRand返回高位,它们比低位更伪随机。

答案 2 :(得分:3)

创建自己的随机数生成器与发明自己的加密技术是同一个类的一个坏主意:很容易构建出现的东西来完成工作,但实际上是灾难性的无效;构建实际上完成工作的东西要困难得多。阅读RANDU的警示故事,然后下载Mersenne Twister的其中一个变种并使用它。

答案 3 :(得分:1)

维基百科上有一整套伪随机数生成器:http://en.wikipedia.org/wiki/List_of_pseudorandom_number_generators