从基于种子随机的集合中选择子集,同时排除已经选择的集合

时间:2017-06-09 09:58:26

标签: c# random random-seed

我想根据作为日期的种子从集合(1-10)中随机选择一组3。我想每天挑选3件新商品,而不是重复我前一天选择的商品。 挑选物品不是问题,但我怎么知道昨天挑选了哪些物品,我可以只知道日期重建它吗?

2 个答案:

答案 0 :(得分:0)

是的,你可以。类Random提供随机序列。当您使用相同的种子值启动它时,序列始终是相同的(检查Random(int seed)构造函数)。所以

  

我如何知道昨天选择了哪些,我可以重建   只知道日期?

要获取您昨天选择的号码,您应该使用与昨天使用的相同的种子。例如。您可以使用Ticks对象DateTime的值作为给定日期。

var today = DateTime.Today();
var random = new Random(today.Ticks);    
var todayItems = items.OrderBy(x => random.Next()).Take(3).ToList();

var yesterday = today.AddDays(-1);
random = new Random(yesterday.Tikcs);
var yesterdayItems = items.OrderBy(x => random.Next()).Take(3).ToList();

现在比较今天和昨天的项目。

答案 1 :(得分:0)

如果您的收藏中有10个项目,那么您可以将3个项目的子集表示为三个二进制数字,并且只设置三个位。只需设置与三个选项对应的位。如果选择集合中的项目0,5和7,则将位数0,5和7设置为10位数字。存储该号码,并使用它来防止第二天再次选择相同的三个。只需将昨天的数字与今天的数字进行比较。 10位数字很容易适合C#整数。