我们有这个随机数生成器:
Random rnd = new Random();
bool PiratePrincess = rnd.Next(1, 5000) == 1;
Run Code Online (Sandbox Code Playgroud)
在每个页面视图上调用此方法.变量应该有1/5000的可能性True.但是,在大约15,000页的浏览量中,这True大约是20次!
有人可以解释为什么会这样,以及如何防止这种情况大约是1/5000倍?完全不随意这一点并不重要.
编辑:这应该这样做吗?
Random rnd = new Random();
bool PiratePrincess = (rnd.Next() + ThisUser.UserID + ThisUser.LastVisit.Ticks + DateTime.Now.Ticks) % 5000 == 1;
Run Code Online (Sandbox Code Playgroud)
这些综合浏览量有多快进入? new Random将根据当前时间进行初始化,因此许多重叠请求将获得相同的随机种子.根据远程IP地址随机化种子和当前时间以获得更多唯一性.
也就是说,可以将硬币翻转20次并且每次都能获得头部.这是一个合理的随机结果.
编辑:这样做
var r = new Random(
Convert.ToInt32(
(ThisUser.UserID ^ ThisUser.LastVisit.Ticks ^ DateTime.Now.Ticks) & 0xFFFFFFFF)
);
var isPiratePrincess = (r.Next (5000) == 42);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
391 次 |
| 最近记录: |