如何根据日期在一定范围内选择随机数?

Dav*_*Dev 4 c# random algorithm

我有数百个扇区类型的列表,其 ID 值范围为 1..999。用户希望每天看到网站上显示不同的随机扇区。

解决此问题的一种方法是存储当天随机选择的扇区 ID 并使用它,然后在第二天使用新的扇区 ID 更新该字段。但这有点混乱,因为这意味着我需要在数据库中的某个位置存储任意值......(或者应用程序状态或其他东西)

我还想我可以采用 1..999 的列表并使用一些随机算法根据日期选择一个随机数,因此只要日期与上次选择随机数的日期相同,将会出现相同的数字。

但我不确定如何实现这一点,所以我正在寻找建议?

此外,考虑到范围的大小 (999) 和一年中的可用天数 (365),这是否意味着该算法总是会错过某些扇区,因为它们的 ID 不会映射到随机数选择过程选择扇区 ID?有没有办法解决?

Guf*_*ffa 5

您可以使用日期作为Random课程的种子:

int day = (DateTime.Today - new DateTime(2000,1,1)).TotalDays;
Random rnd = new Random(day);
int id = rnd.Next(1, 1000);
Run Code Online (Sandbox Code Playgroud)

请注意,该日期是根据固定的开始日期而不是 计算的DateTime.DayOfYear,因此不会每年重新开始,并且仅使用 365 个值。


Jim*_*hel 5

您真的想要一个随机值,还是只想每天显示不同的扇区?随机给出了相同扇区信息将连续两天(或可能更多)显示的可能性。在 365 天内,您也很可能会得到多个重复项。使用从 999 个项目的列表中随机选择的方法,您极不可能在 365 次尝试中获得 365 个不重复的数字。

有什么理由让你每年都必须重新开始吗?为什么不设置某个日期(例如 2011 年 1 月 1 日)作为您的“纪元”日期。然后,要选择一个项目,只需从当前日期中减去该日期即可得到天数,然后除以 999 并取余数,即得到索引。那是:

DateTime EpochDate = new DateTime(2011, 01, 01);
TimeSpan Elapsed = DateTime.Now.Date - EpochDate;
int index = Elapsed.Days % 999;
Run Code Online (Sandbox Code Playgroud)

此时,index是 0..998 范围内的一个数字。然后,您可以使用该数字来索引您的扇区 ID。要么直接索引(因此 2011 年 1 月 1 日将获得第一个扇区 ID,1 月 2 日将获得第二个扇区 ID,等等),或者对索引进行某种计算以“随机化”它。