Список заказов "случайно" в день - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть IQuerable<Post> и для случайной сортировки я делаю следующее:

IQuerable<Post> posts = getPosts();

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

Можно ли отсортировать его случайным образом, но для каждого дня?

Если я закажу его 18 апреля я всегда получал один и тот же заказ.

Но 19 апреля я получал другой случайный заказ.

1 Ответ

4 голосов
/ 19 апреля 2020

Направляющие не гарантируются случайными, только уникальными. Не используйте направляющие для случайных данных. В платформе. NET есть определенные c классы, предназначенные для выдачи (псевдо) случайных чисел - 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.

...