线性同余算法 (LCG)

来源:互联网 发布:微店网络似乎存在问题 编辑:程序博客网 时间:2024/05/16 08:32

动机:为了校验客户端和服务器的数据,用到了boost::rand48 这个随机生成器算法。可怎么都找不到C# 与C++ 相同的rand48随机生成器算法的API以及库,于是决定自己写个 随机数生成器吧。

线性同余方法(LCG)是个产生伪随机数的方法。


计算公式:RandSeed=(A*RandSeed+C)%M

其中A,C,M是产生器设定的常数。

下面是我写的C#与C++ 相同的伪随机数代码:

#ifndef XK_Random_H#define XK_Random_H#include <stdio.h>  #include <time.h>  #include <iostream>#include <math.h>#include <string>#include <cassert>class xk_Random{public:xk_Random(uint64_t seed){rand_seed = seed;}uint64_t rand(uint64_t min, uint64_t max){assert(max>min && min>=0);uint64_t A = 0x5DEECE66D;uint64_t C = 0xB;uint64_t M = ((uint64_t)1 << 48);rand_seed = (rand_seed * A + C) % M;uint64_t bb = max - min;uint64_t value = rand_seed%bb + min;return value;}std::string rand_str(std::string data, int count){std::string retstr;for (uint32_t i = 0; i<count; i++){retstr += data[rand(0, data.length())];}return retstr;}private:uint64_t rand_seed;};#endif

  class xk_Random    {        public xk_Random(ulong seed = 0)        {            rand_seed = seed;        }        public ulong rand(ulong min, ulong max)        {            System.Diagnostics.Debug.Assert(max > min && min >= 0);            ulong A = 0x5DEECE66D;            ulong C = 0xB;            ulong M = ((ulong)1 << 48);            rand_seed = (rand_seed * A + C) % M;            ulong bb = max - min;            ulong value = rand_seed % bb + min;            return value;        }        private ulong rand_seed;    };



0 0
原创粉丝点击