为什么是随机().Next(最小值、最大值)始终 ASP.NET MVC 应用中生成相同的最小值

本文关键字:最小值 应用 MVC 始终 Next 随机 最大值 ASP 为什么 NET | 更新日期: 2023-09-27 18:31:02

经过一个小时的分析,我试图完全理解一些在这一点上看起来很神秘的东西。请耐心等待详细说明。

我在 asp.net mvc4应用程序中获得了一个功能。

    private string GenerateDownloadCode(int id, int organizationId)
    {
        const int downloadCodeMinValue = 10000000;
        const int downloadCodeMaxValue = 20000000;
        int number = new Random().Next(downloadCodeMinValue, downloadCodeMaxValue);
        return string.Format("{0}-{1}-{2}", id, organizationId, number);
    }

该函数用于生成用于下载代码的随机数。我注意到number值总是等于downloadCodeMinValue

我检查了MSDN,并在框架代码中深入研究了Next方法的实现,如下所示:

      long range = (long)maxValue-minValue;
      if( range <= (long)Int32.MaxValue) {  
          return ((int)(Sample() * range) + minValue);
      }          
      else { 
          return (int)((long)(GetSampleForLargeRange() * range) + minValue);
      }

Sample() 方法可以返回值 0.0 到 1.0,我认为在我的情况下它总是返回 0.0,导致此方法返回 minValue。好的,它是"随机数的合法值"。

我可以忍受它,直到我拿起我的方法并将其复制到 LINQPad 中,在那里它始终如一地生成一个随机数。

Q1:为什么相同的方法在 LINQPad 中返回预期的随机数?

阅读了一些关于这个问题的问题(非常接近我的问题,特定于 MVC 但不考虑我的情况),这些问题解释了Random类行为并提供了一些解决方案。

上面的链接假设代码是在闭环或更短的时间段内调用的,在我的例子中,这种方法被称为至少分钟差异,如果不是小时的话。

我对取回相同的号码没有问题,所以不想修复代码,无法和好奇地理解为什么它在 MVC 应用程序中不起作用(每个请求都在一个新线程中提供),让我联系这里的专家。

Q2:那么该方法在 MVC 应用中不返回随机数的原因可能是什么?

更新:

方法的上下文 - 此方法用于为每个添加的新组织生成一个新的随机长整型 (>= 12 个字符) 足够的数字。因此,每个呼叫都会延迟几分钟。

更新 2:

该方法从存在于不同库(业务或服务)中的方法AddOrganizationUser调用。从控制器操作调用服务方法

    public ActionResult CreateUser(OrganizationUserViewModel ouser)
        {    
            organizationUserService.AddOrganizationUser(organizationUserDomainModel, loggedInUser.Id);    
        }

为什么是随机().Next(最小值、最大值)始终 ASP.NET MVC 应用中生成相同的最小值

我认为您是从多线程环境中调用它的?随机不是线程安全的。

以下是实现线程安全随机的多种方法。http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx

希望这有帮助

编辑:此外,为每个随机数创建一个新的随机数也是不好的做法。