在Web服务中植入Mersenne Twister
本文关键字:Mersenne Twister Web 服务 | 更新日期: 2023-09-27 18:22:34
我需要创建一个接收一些数据并返回随机数的web服务。随机数必须由Mersenne Twister算法生成。
其中一个规范是播种Mersenne Twister。因为是web服务,所以我必须在每个请求中为Mersenne对象添加一个新的种子吗?
与每个伪随机生成器一样,生成的输出列表都是通过使用所述种子创建的。如果给相同的种子,生成的序列输出将始终相同。所以你应该问你想要一个恒定的序列还是一个真正随机的序列。
回答您的问题:
您可以在WebService中使用静态常数值(如果安全性是一个问题,我不建议这样做),或者您可以使用以下内容:
long next_seed = DateTime.Now.Ticks ^ someValue;
以生成"随机"种子。
希望这能帮助
它是一个web服务,所以该类在每次调用时都会从头开始初始化,并且无论如何都会重新种子化,除非您使Mersenne Twister随机化器类实例static
,这样它就不需要重新种子化。然而,如果您这样做,您应该每隔一段时间重新初始化(销毁/重新创建)实例,因为Mersenne Twister值在600多个pull之后是可以猜测的。
为了提高性能,最好创建一个静态实例,并按照以下伪代码每500次拉取重新初始化一次:
class RandomNumberGenerator
{
static MersenneTwisterClass RNG = null;
static object RNGLock = new object();
static int counter = 0;
public RandomNumberGenerator()
{
Init();
}
void Init()
{
// Multithreading lock
lock (RNGLock)
{
// Seed it or don't, your call
RNG = new MersenneTwisterClass(some_seed_value_or_nah);
counter = 0;
}
}
public decimal GetValue()
{
lock (RNGLock)
{
counter++;
if (counter > 500)
{
Init();
}
return RNG.GetValue();
}
}
public long GetRange(long min, long max)
{
lock (RNGLock)
{
counter++;
if (counter > 500)
{
Init();
}
return RNG.GetRange(min, max);
}
}
}