【问题标题】:Seeding Mersenne Twister in Web Service在 Web 服务中播种 Mersenne Twister
【发布时间】:2016-02-21 19:31:31
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    回答你的问题:

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

    long next_seed = DateTime.Now.Ticks ^ someValue;
    

    生成“随机”种子。

    希望对你有帮助

    【讨论】:

    • 如果我使用 static ,为什么安全会成为问题?
    • 因为如果您根据固定输入和固定种子检索一些固定输出,那么有足够时间的人可以弄清楚...除非您提供的服务不需要安全,否则您可以忽略那个方面。最后是你的电话,我只是指出一些一般情况。另一件事我指的是静态常量而不是静态变量,因为它可以为每次调用随机化。
    • 因为它是一个网络服务,这个类在每个请求上都是newed,所以他不必提供一个种子值来保持它的随机性。他/她可以初始化 PRNG 类并让它使用默认的DateTime.Now.Ticks,因为它不容易被猜到。然而,就我个人而言,我不会那样做,我会写一个类,这样我就可以完全控制播种过程。
    【解决方案2】:

    这是一个 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);
            }
        }
    
    }
    

    【讨论】:

    • 种子每分钟刷新一次。
    • 添加了伪代码来展示我如何使用我的 PRNG 实现。
    猜你喜欢
    • 2010-12-19
    • 2012-01-13
    • 2014-02-22
    • 2017-11-23
    • 2023-03-18
    • 2016-01-06
    • 2017-06-10
    • 2017-08-20
    • 2014-04-17
    相关资源
    最近更新 更多