1

如何使用 threadstatic 种子从一系列数字中生成随机数?

我需要在多种方法的范围内创建随机数。问题是相同的旧副本。

我找到了一个 MSDN 博客,它有一个很好的随机生成器,但我需要一个介于两个值之间的范围(通常是 0 - 100)。

http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx

public static class RandomGenNumber
    {
        private static RNGCryptoServiceProvider _global =
            new RNGCryptoServiceProvider();
        [ThreadStatic]
        private static Random _local;

        //this works
        public static int Next()
        {
            Random inst = _local;
            if (inst == null)
            {
                byte[] buffer = new byte[4];
                _global.GetBytes(buffer);
                _local = inst = new Random(
                    BitConverter.ToInt32(buffer, 0));
            }
            return inst.Next();
        }

        //this is what needs to be fixed
        public static int Next(int low, int high)
        {
            Random inst = _local;
            if (inst == null)
            {
                byte[] buffer = ????;

                _global.GetBytes(buffer);
                _local = inst = new Random(
                    BitConverter.ToInt32(buffer, 0));
            }
            return inst.Next();
        }
    } 

当我循环时,我想传递一个范围

//this is called on a loop and I want to avoid duplicates
     internal ExampleMember PopulateMember()
    {
        var member = new ExampleMember();

        member.gender = RandomGenNumber.Next(0, 100) < 42 ? "M" : "F";

        member.personalityTypeId = RandomGenNumber.Next(1, 45);

        member.age = RandomGenNumber.Next(20, 80);

        ...

我在这里阅读了数十篇文章,但找不到范围的示例。

生成数字的字节方式看起来很干净,但我无法让它在一个范围内工作。我应该传递整数还是加倍并乘以?或者如何在具有开始和结束范围的 Next 的重载中使用该缓冲区值?

4

1 回答 1

2

inst.Next()应该是inst.Next(low, high)。就这样。播种部分无需触摸。将其移动到辅助方法中(例如static Random GetThreadStaticRandom())。

于 2015-04-04T14:38:17.880 回答