【问题标题】:Order list "randomly" per day每天“随机”订购清单
【发布时间】:2020-04-18 22:02:37
【问题描述】:

我有一个IQuerable<Post>,要随机排序,我会执行以下操作:

IQuerable<Post> posts = getPosts();

posts = posts.OrderBy(x => Guid.NewGuid());

是否可以每天随机排序?

如果我在 4 月 18 日订购,我总是会收到相同的订单。

但在 4 月 19 日,我会收到另一个随机订单。

【问题讨论】:

  • Post 的收集是否在白天发生变化?基于日期的过期时间缓存怎么样?您每天只订购一次,然后一整天都使用缓存订单,第二天再重新订购?
  • 这能回答你的问题吗? Randomize a List<T>
  • @PavelAnikhouski - 为什么会回答这个问题?
  • @Enigmativity 因为它解释了如何使用Random 类、Guid.NewGuid 和其他技术来解决 OP 问题,以及该站点上的大量重复
  • @PavelAnikhouski - 但这不是 OP 所要求的。他希望每天都有一个稳定的排序。他清楚地知道如何随机排序(尽管他使用的 Guid 并不是获得随机性的最佳方式)。

标签: c# linq linq-to-entities


【解决方案1】:

Guid 不能保证是随机的,只能是唯一的。不要将 Guid 用于随机数据。 .NET 框架中有一些特定的类旨在提供(伪)随机数 - Random 是最简单的类,但如果您想要密码质量,请尝试 System.Security.Cryptography.RandomNumberGenerator

在您的情况下,Random 是您的朋友。您可以使用从今天创建的值为其播种。

试试这个:

var seed = (int)DateTime.Now.Date.Ticks;
var random = new Random(seed);

IQueryable<Post> posts = getPosts();

Post[] sorted =
    posts
        .ToArray()
        .Select(post => new { post, random = random.Next() })
        .OrderBy(x => x.random)
        .Select(x => x.post)
        .ToArray();

当我使用线束代码运行它时:

IQueryable<Post> getPosts()
{
    return Enumerable.Range(0, 5).Select(x => new Post() { Id = x }).AsQueryable();
}

public class Post
{
    public int Id;  
}

我今天收到4, 3, 1, 0, 2。明天它将是4, 2, 3, 0, 1。周二是3, 4, 2, 0, 1

【讨论】:

  • 这是一个很好的答案——这里只是给不熟悉Random的人的一些注释,该类实现了伪随机数生成,对于相同的种子值,Next 返回相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多