リニア同余アルゴリズム(LCG)
1691 ワード
動機:クライアントとサーバのデータを検証するためにboost::rand 48というランダムジェネレータアルゴリズムを用いた.C#とC++が同じrand 48ランダムジェネレータアルゴリズムのAPIやライブラリがなかなか見つからないので、自分で乱数ジェネレータを書くことにしましょう.
線形同余法(LCG)は擬似乱数を生成する方法である.
計算式:RandSeed=(A*RandSeed+C)%M
ここで、A,C,Mは発生器が設定した定数である.
以下は私が書いたC#とC++の同じ擬似乱数コードです.
線形同余法(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;
};