C#随机数经常超过预期

Tom*_*len 2 c# asp.net random

我们有这个随机数生成器:

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)

Bry*_*her 8

这些综合浏览量有多快进入? 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)