在Web服务中播种Mersenne Twister

时间:2015-11-19 15:11:14

标签: c# web-services random-seed mersenne-twister

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

其中一个规格是播种Mersenne Twister。因为是Web服务,我是否必须使用新种子在每个请求中播种Mersenne对象?

2 个答案:

答案 0 :(得分:0)

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

回答你的问题:

您可以在WebService中使用静态常量值(如果我不建议考虑安全性),或者您可以使用以下内容:

long next_seed = DateTime.Now.Ticks ^ someValue;

生成"随机"种子。

希望这有帮助

答案 1 :(得分:0)

它是一个Web服务,因此该类将在每次调用时从头开始初始化并且无论如何都要重新接种,除非你制作Mersenne Twister随机函数类实例static所以它不需要重新接种。但是,如果你这样做,你应该经常重新初始化(销毁/重新创建)实例,因为在经过600次拉动之后可以猜测Mersenne Twister值。

为了提高性能,最好按照以下伪代码创建一个静态实例并重新初始化每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);
        }
    }

}