这个问题来自这样的知识,即当new Random()
被快速调用时,它会以我假设基于的相同值播种DateTime.Now.Ticks
。
假设您在最新版本的 ASP.NET、IIS、.NET 等上有一个高流量的 Web 应用程序。它实现了一个在线赌场。我认为模拟老虎机需要从单个随机数流中提取。
在大容量情况下,您可能会得到两台具有相同随机数生成器的老虎机,从而导致过多的大头奖。我对伪随机生成器没有完全了解,但我的直觉是,要安全地实施在线赌场,您确实需要从一个只播种一次的生成器中提取。
我能想到的一个解决方案是一个同步队列,它有一个推送数字的线程,但我不知道如何在多站点应用程序之间同步它。
这种情况有一个好的/标准的解决方案吗?
更新:我正在处理的实际场景(实际上没有机会获得足够的音量来导致问题)
我的实际情况是,我有一个流量适中的 asp.net Web 表单站点,并且需要在每个请求上显示两个用户控件之一。我使用以下代码这样做:
// Randomly display one of (FreeCreditScore1, MyFreeScoreNow1)
private void ShowCreditScoreAd()
{
FreeCreditScore1.Visible = (new Random().Next(2) == 1);
MyFreeScoreNow1.Visible = !FreeCreditScore1.Visible;
}
如果我通过快速连续调用上面的代码来对上面的代码进行单元测试,它会失败,我开始明白原因是它new Random()
在同一个“tick”中被调用。
也就是说,我确实相信我目前的实现已经足够了(请随时纠正我),但我很好奇如果我真的想严格要求它如何解决......