リニア同余アルゴリズム(LCG)

1691 ワード

動機:クライアントとサーバのデータを検証するためにboost::rand 48というランダムジェネレータアルゴリズムを用いた.C#とC++が同じrand 48ランダムジェネレータアルゴリズムの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;
    };