线性同余算法 (LCG)

动机:为了校验客户端和服务器的数据,用到了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   
#include   
#include 
#include 
#include 
#include 

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

  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;
    };



你可能感兴趣的:(C)