繁体   English   中英

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

[英]How to select a random number in a range based on date?

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

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

我也在想我可以取1..999的列表并使用一些随机算法来根据日期选择一个随机数,所以只要日期与上一次选择随机数相同,相同的数字将出来。

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

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

您可以将日期用作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个值。

你真的想要一个随机值,或者你只想每天展示一个不同的扇区? 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将获得第二个,等等),或者对索引进行某种计算以“随机化”它。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM