0

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

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

4

2 回答 2

0

这是一个 Web 服务,因此该类将在每次调用时从头开始初始化并且无论如何都会重新播种,除非您创建 Mersenne Twister 随机器类实例static,因此不需要重新播种。但是,如果您这样做,您应该每隔一段时间重新初始化(销毁/重新创建)实例,因为 Mersenne Twister 值在 60​​0 次拉动后是可以猜测的。

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

}
于 2015-11-19T15:50:39.280 回答
0

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

要回答您的问题:

您可以在 WebService 中使用静态常量值(如果安全是一个问题,我不建议这样做),或者您可以使用类似的东西:

long next_seed = DateTime.Now.Ticks ^ someValue;

生成“随机”种子。

希望这可以帮助

于 2015-11-19T15:42:29.087 回答