【问题标题】:Random ThreadStatic Number within Ranges范围内的随机线程静态数
【发布时间】:2015-04-04 14:30:29
【问题描述】:

如何使用线程静态种子从一系列数字中生成随机数?

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

我发现了一个 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 的重载中使用该缓冲区值?

【问题讨论】:

    标签: c# asp.net random rngcryptoserviceprovider


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 1970-01-01
      • 2010-12-24
      • 2011-02-14
      • 1970-01-01
      • 2021-02-10
      • 2019-08-31
      • 2014-05-08
      相关资源
      最近更新 更多