为什么是随机().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);
}
我认为您是从多线程环境中调用它的?随机不是线程安全的。
以下是实现线程安全随机的多种方法。http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx
希望这有帮助
编辑:此外,为每个随机数创建一个新的随机数也是不好的做法。