在Web服务中植入Mersenne Twister

本文关键字:Mersenne Twister Web 服务 | 更新日期: 2023-09-27 18:22:34

我需要创建一个接收一些数据并返回随机数的web服务。随机数必须由Mersenne Twister算法生成。

其中一个规范是播种Mersenne Twister。因为是web服务,所以我必须在每个请求中为Mersenne对象添加一个新的种子吗?

在Web服务中植入Mersenne Twister

与每个伪随机生成器一样,生成的输出列表都是通过使用所述种子创建的。如果给相同的种子,生成的序列输出将始终相同。所以你应该问你想要一个恒定的序列还是一个真正随机的序列。

回答您的问题:

您可以在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);
        }
    }
}