如何根据日期选择范围内的随机数?

时间:2011-02-22 12:45:14

标签: c# algorithm random

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

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

我还以为我可以取1..999的列表,并使用一些随机算法根据日期选择一个随机数,所以只要日期与上一次随机数是相同的选中后,会出现相同的数字。

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

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

4 个答案:

答案 0 :(得分:4)

您可以将日期用作Random类的种子:

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

请注意,该日期是从固定的开始日期而非DateTime.DayOfYear计算的,因此它不会每年重新启动,只会使用365个值。

答案 1 :(得分:3)

您真的想要一个随机值,还是只想每天显示一个不同的扇区? Random提供了相同扇区信息连续两天(或可能更多)显示的可能性。也很可能在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;

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

答案 2 :(得分:2)

回答关于组合学的第二个问题:

您有999个号码和365天。 您可以每天选择一个随机数,这意味着在任何情况下您都不能显示超过365个(不同的)数字。有些数字也可能重复。你必须根据你想要的方式来设计逻辑。

在这种情况下,您的随机对象确实需要持续365天。

答案 3 :(得分:1)

您可以使用Cache课程,并在午夜过期。当缓存条目不存在时,创建一个具有随机值的新条目,在午夜到期......

对于随机值,请使用System.Random - 无需在此重新发明轮子。